并发中线程状态:

1.新建  :创建后尚未启动。

2.可运行  : 可能正在运行,也可能正在等待 CPU 时间片。包含了操作系统线程状态中的 Running 和 Ready。

3.阻塞    :  等待获取一个排它锁,如果其线程释放了锁就会结束此状态

4.无限期等待   :等待其它线程显式地唤醒,否则不会被分配 CPU 时间片  

5.限期等待  :无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。

6.死亡

操作系统中线程状态:

1.新建      2.就绪      3.运行       4.阻塞        5.销毁

 

使用线程

1.实现Runnable接口,实现run()方法

2.实现Callable接口,实现call()方法

3.继承Thread类,重写run()方法

4.使用Executor多线程并发框架创建线程池  详见Executor框架Java并发编程

Java并发

同步:包括互斥锁和共享锁

互斥锁

  1.第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock(重入锁)。

比较

1. 锁的实现

synchronized 是 JVM 实现的,而 ReentrantLock 是 JDK 实现的。

2. 性能

新版本 Java 对 synchronized 进行了很多优化,例如自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等,synchronized 与 ReentrantLock 大致相同。

3. 等待可中断

当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。

ReentrantLock 可中断,而 synchronized 不行。

4. 公平锁

公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁。

synchronized 中的锁是非公平的,ReentrantLock 默认情况下也是非公平的,但是也可以是公平的。

5. 锁绑定多个条件

一个 ReentrantLock 可以同时绑定多个 Condition 对象。

共享锁  (JUC-AQS)

1.CountDownLatch:用来控制一个线程等待多个线程完成后再继续执行

Java并发

2.CyclicBarrier(循环屏障):控制多个线程相互等待,只有当多个线程都到达时,这些线程才会继续执行。

Java并发

3.Semaphore:类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。

 

原子数:

AtomicInteger 中主要实现了整型的原子操作,防止并发情况下出现异常结果,其内部主要依靠JDK 中的unsafe 类操作内存中的数据来实现的。volatile 修饰符保证了value在内存中其他线程可以看到其值得改变。CAS操作保证了AtomicInteger 可以安全的修改value 的值

 

内存模型(JMM)

包括主内存-工作内存-线程

JMM三大特性:

1.原子性  :可使用原子类或synchronized实现

2.可见性:可使用final、volatile(修饰的变量被修改后会直接更新主内存内容,读取被volatile修饰的变量时认为工作内存中该对象无效,直接从主内存中读取)、synchronized

3.有序性:可使用volatile(禁止指令重排序)、synchronized实现

非阻塞同步:

1.原子类

2.CAS(比较交换)

可能产生的问题:

    第一个ABA问题:解决方案:版本号

    第二个可能导致长时间无法执行成功

 

原文:https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%B9%B6%E5%8F%91.md

相关文章:

  • 2021-05-27
  • 2021-04-28
猜你喜欢
  • 2021-10-11
  • 2022-12-23
  • 2022-12-23
  • 2022-01-16
  • 2021-08-12
相关资源
相似解决方案