Synchronized学习

一.

java模型(JMM)线程数据交互过程

Synchronized学习_第1张图片

二,保证原子性

 

Synchronized学习_第2张图片

三,保证可见性

1.用volatile,当线程2修改完x变量后,会同步到主内存,然后其它线程的变量会去再读取主内存x变量

 

Synchronized学习_第3张图片

2.用synchronized,当线程1走到了synchronized时,会调用主线程的lock操作,这时,线程1会去读取主内存的的值,刷新一下该变量

Synchronized学习_第4张图片

Synchronized学习_第5张图片

 

三,保证有序性

1.用volatile修改变量,可以保证变量不发生重排序,这样也保证有序性

2.用synchronized:Synchronized学习_第6张图片

四,synchronized可重入性不可中断性,reentranlock可以选择中断或者不中断

五,synchronized里面记录monitor重量级锁(owner,次数),owner为哪个线程,次数指重入次数

六.synchronized在jdk1.6后优化

过程:无->偏向所->轻量级->重量级

 

Synchronized学习_第7张图片

 

七,CAS乐观锁

即compareAndSwap,比较相同则交换原是

Synchronized学习_第8张图片

 

在高并发情况下,用悲观锁(Synchronized和ReentranLock)更好,不使用CAS

 

八,和ThreadLocal区别(面试问到)

定义变量i,用ThreadLocal 时,如果是两个线程去访问,两个线程会各去拷贝一份i副本,这样就互相影响,保证线程安全. 

 

ThreadLocal 与 Synchronized区别

相同:ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。
不同:Synchronized同步机制采用了“以时间换空间”的方式,仅提供一份变量,让不同的线程排队访问;而ThreadLocal采用了“以空间换时间”的方式,每一个线程都提供了一份变量,因此可以同时访问而互不影响。

以时间换空间->即枷锁方式,某个区域代码或变量只有一份节省了内存,但是会形成很多线程等待现象,因此浪费了时间而节省了空间。
以空间换时间->为每一个线程提供一份变量,多开销一些内存,但是呢线程不用等待,可以一起执行而相互之间没有影响

你可能感兴趣的:(Synchronized学习)