文章目录

  • 1. 进程和线程
  • 2.线程对象
  • 3.线程同步
  • 1. 线程冲突
  • 2. 同步语句
  • 4 .线程死锁
  • 5.线程协调
  • 6.高级并发对象
  • 锁对象
  • 线程池


1. 进程和线程

串行

并行

串行是指多个任务完成时,各个任务按顺序执行,完成最后一个才能进行下一个

并行指的是多个任务可以同时执行

并行

并发

同时进行两个操作,作用于不同对象

同时进行两个操作,作用于同一个对象

进程

线程

具有独立的执行环境,每个进程都有完整的存储空间

相当于进程的子系

2.线程对象

有三种实现方式(此处不详细讲解):
1:实现 Runnable接口
2: 继承Thread类
3:继承Callable类

yield方法

sleep方法

join方法

Thread类中提供了一种礼让方法,使用yield()方法表示,它只是给当前正处于运行状态下的线程一个提醒,告知它可以将资源礼让给其他线程,但这仅仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让

Thread.sleep使当前线程在指定时间段内暂停执行。这是使处理器时间可用于应用程序的其他线程或计算机系统上可能正在运行的其他应用程序的有效方法

join方法允许一个线程等待另一线程的完成。如果t是Thread正在执行其线程的对象,t.join();导致当前线程暂停执行,直到t的线程终止。

3.线程同步

1. 线程冲突

当在不同线程中运行作用于相同数据的两个操作时,就会发生干扰。这意味着这两个操作由多个步骤组成,并且步骤顺序重叠。

  1. 检索的当前值c。
  2. 将检索到的值增加1。
  3. 将增加的值存储回c。

2. 同步语句

Java编程语言提供了两种基本的同步习惯用法:同步语句(synchronized statements )和同步方法(synchronized
methods )。

创建同步代码的一种方法是使用同步语句。与同步方法不同,同步语句必须指定提供内部锁的对象。

同步语句对于通过细粒度同步提高并发性很有用。

4 .线程死锁

死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。

死锁不仅仅在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,互相等待,而永久处于阻塞状态

5.线程协调

这里我就根据我的简单理解写了

wait方法

notify方法

等待

唤醒

6.高级并发对象

锁对象

同步代码依赖于一种简单的可重入锁。这种锁易于使用,但有很多限制。java.util.concurrent.locks软件包支持更复杂的锁定习惯用法

Lock对象的工作方式非常类似于同步代码所使用的隐式锁。与隐式锁一样,一次只能有一个线程拥有一个Lock对象。Lock对象还wait/notify通过其关联的Condition对象支持一种机制

线程池

Java中创建和销毁一个线程是比较昂贵的操作,需要系统调用。频繁创建和销毁线程会影响系统性能。

使用线程池带来以下好处:

  1. 降低资源的消耗。线程本身是一种资源,创建和销毁线程会有CPU开销;创建的线程也会占用一定的内存。
  2. 提高任务执行的响应速度。任务执行时,可以不必等到线程创建完之后再执行。
  3. 提高线程的可管理性。线程不能无限制地创建,需要进行统一的分配、调优和监控。