并发编程-多线程

1、看一下代码存在原子性问题?

并发编程-多线程

并发编程-多线程

2、锁

并发编程-多线程

3、synchronize同步、互斥锁(重量级锁)

基本使用:

1、使用实例方法  锁当前实例(不同实例不会产生影响)

2、使用静态方法  锁的类级别的(不同实例产生互斥)

3、使用静态代码块  锁当前实例(不通实例不会产生影响)

并发编程-多线程

 

 

截图中:demo1和demo2都是对象锁,只不过demo2可以在synchronize的代码块前后,写一些业务逻辑,只保护代码块中的内容

demo3和demo4是类锁级别(全局锁)

并发编程-多线程

锁的存储:

并发编程-多线程

并发编程-多线程

并发编程-多线程

 

并发编程-多线程

并发编程-多线程

轻量级锁(自旋):

并发编程-多线程

并发编程-多线程

并发编程-多线程

 

重量级锁:

并发编程-多线程

 

并发编程-多线程

=========================================================================================

volatile关键字(保证可见性)lock:主线程修改stop的值对TI线程不可见

并发编程-多线程

多了一个lock的汇编指令

并发编程-多线程

 

JMM内存模型:(可见性)

导致可见性的根本原因是 高速缓存和重排序

JMM提供了合理的禁止缓存和重排序的方法来解决可见性问题

JMM最核心的价值是解决了可见性和有序性

并发编程-多线程

并发编程-多线程

并发编程-多线程

并发编程-多线程

 

加volatile关键字的变量,通过内存屏障,保证对变量的修改,一定是可见的

并发编程-多线程