读java多线程编程核心技术做的笔记以便于以后理解
文章目录
试验代码链接: 百度 baidu
链接:https://pan.百度.com/s/1ibIBSPifyTL1IF51vBnzdQ
提取码:ahhf
1.synchronized的使用方法
1.1synchronized修饰方法
-
- 调用当前方法的对象作为锁
-
- 注意:多个对象时,多个锁
-
-
一个有锁一个无锁时,不同步。
-
A线程先持有object对象的锁,B线程可以以异步的方式调用object对象的非synchronized类型的方法
-
在方法声明出添加synchronized并不是锁而是锁当前类的对象,在java中只有将对象作为锁这种说法,而没有锁方法这种说法
-
如果在X对象中使用了synchronized关键字声明非静态方法,则x对象就被当成锁
-
同步方法的弊端
A线程调用同步方法执行一个长时间的任务,那么B线程等待的时间就比较长。可使用同步方法块解决
1.2synchronized修饰代码块
-
当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一段时间只能有一个线程得到执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
-
当一个线程访问object的一个synchronized同步代码块时,另一个仍然可以访问该object对象中的非synchronized同步代码块。解决同步方法弊端不在synchronized块中就是异步执行,在synchronized块中就是同步执行。
-
在使用同步synchronized(this)代码块时需要注意当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object中所有其他synchronized(this)同步代码块的访问将被阻塞,这说明synchronized使用的对象监视器是同一个,即用的锁是同一个
-
验证同步synchronized(this)代码块是锁定当前对象的。
-
将任意对象作为锁 锁非this对象具有一定的优点:如果一个类中很多个synchronized方法,则这是虽然能实现同步,但影响运行效率,如果使用同步代码块锁非this对象,则synchronized(非this)代码块中的程序和同步方法是异步的,因为是不同的锁,不与其它锁this同步方法争抢this对象,可大大提高运行效率。
-
多个锁就是异步执行
-
验证
-
- 7.1当多个线程同时执行synchronized(x){}同步代码块是呈同步效果
7.2当其它线程执行x对象中synchronized同步方法时呈同步效果
7.3当其它线程执行x对象方法里面的synchronized(this)代码块时呈同步状态
- 7.1当多个线程同时执行synchronized(x){}同步代码块是呈同步效果
- 锁对象改变导致异步执行
1.3 静态synchronized方法和synchronized(class)代码块
- 关键字synchronized还可以应用在static静态方法上,这是对当前的*.java文件对应的class类对象进行持锁,class类对象是单例的,更具体地说在静态static方法上使用synchronized关键字声明同步方法时,使用当前静态方法所在类对应Clas类的单例对象作为锁。
- 同步syn static方法可以对类的所有对象实例起作用,Class锁可以对类的所有对象实例起作用,即不同的对象同步静态方法还是同步执行
- 同步syn(class)代码块可以对类的所有对象实例起作用,Class锁可以对类的所有对象实例起作用,即不同的对象静态同步代码块还是同步执行
2.synchronized方法的特性
2.1锁重入
关键字synchronized拥有重入锁的功能,即在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以得到该对象锁的,这也证明一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的。
2.2锁重入支持继承环境
子类是完全可以通过锁重入调用父类的同步方法的。
2.3出现异常锁自动释放
使用synchronized,当一个线程执行的代码出现异常时,其持有的锁会自动释放。
Lock锁遇到异常时,并不会自动释放。
2.4重写方法不使用synchronized
重写方法如果不使用synchronized关键字,即是同步方法,使用后变成同步方法。