synchronized的初步理解
1.两个线程同时访问一个对象的同步方法
需要等待线程结束
2.两个线程访问的是两个对象的同步方法
同时并行执行的
3.两个线程访问的是synchronized的静态方法
共用一把锁 会一个个的执行
4.同时访问同步方法和非同步方法
同时并行执行
Synchronized所修饰的方法才被作用 其他未被修饰的不受影响
5.访问同一个对象的不同的普通同步方法
串行 实际上拿到的是同一个this的锁
6.同时访问静态同步和非静态同步方法
Static修饰的同步方法是类锁.class
同步方法则是this(对象锁) 锁对象不同
并行
7.方法抛异常后,会释放锁
一旦抛出了异常,第二个线程会立刻进入同步方法,意味着锁已经释放
RuntimeException();
-
*Synchronized的性质**
①可重入
指的是同一线程的外层函数获取锁以后,内层函数可以直接再次获取该锁
好处:避免死锁,提升封装性
粒度(范围):
1.同一个方法是可重入的
2.可重入不要求是同一个方法
3.证明可重入不要求是同一个类中的
②不可中断
**可见性原理**:JAVA内存模型
Java内存模型是围绕着并发编程中原子性、可见性、有序性这三个特征来建立的。
原子性(Atomicity):一个操作不能被打断,要么全部执行完毕,要么不执行。在这点上有点类似于事务操作,要么全部执行成功,要么回退到执行该操作之前的状态。
可见性:一个线程对共享变量做了修改之后,其他的线程立即能够看到(感知到)该变量这种修改(变化)。
有序性:对于一个线程的代码而言,我们总是以为代码的执行是从前往后的,依次执行的。这么说不能说完全不对,在单线程程序里,确实会这样执行;但是在多线程并发时,程序的执行就有可能出现乱序。用一句话可以总结为:在本线程内观察,操作都是有序的;如果在一个线程中观察另外一个线程,所有的操作都是无序的。前半句是指“线程内表现为串行语义(WithIn Thread As-if-Serial Semantics)”,后半句是指“指令重排”现象和“工作内存和主内存同步延迟”现象。
Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存(可以与前面将的处理器的高速缓存类比),线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成,线程、主内存和工作内存的交互关系如下图所示
****sychronized的缺陷***
**Lock的几个用法**