JAVA知识回顾-第六天
线程同步的方法:sychronized、lock、reentrantLock等
- 能保证同一时刻只有一个线程执行该代码块,其他这时访问这个修饰的同步代码块的线程都将被暂时阻塞
- 当一个Object对象的同步代码块一个线程正在执行时,另一个线程可以对这个Object对象的非同步代码块进行操作
- 当一个Object对象的一个同步代码块正在一个线程被执行时,另一个线程对这个Object对象的其他同步代码块的访问也会被阻塞
synchronized包括:synchronized方法和synchronized块
- synchronized方法:通过在方法声明中加入synchronized关键字来声明同步方法。
synchronized块:通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized(syncObject) {
//允许访问控制的代码
}
Lock是一个接口,reentrantLock是Lock接口的一个实现类
下面是一个基本用法
Lock lock = new ReentrantLock();
public void fun() {
lock.lock();//得到锁
try {
//同步代码段
} finally{
lock.unlock();//释放锁
}
}
为了保证锁最终被释放,将执行的代码段放到try中,释放锁放在finally内
对象锁和类锁
- 有一个类叫A,其中有个非静态synchronized修饰的fun()方法,有两个A类的实例,这两个实例能被两个线程同时调用fun(),因为它们是不同的对象,所以说对象锁匙针对对象的。类锁其实是A类中有个静态synchronized修饰的fun()方法,所有对象都共用一个fun(),所以当其他线程调用的时候就要排队,就如同类被锁上了一样。
我的感受
- 同步代码块对于Android开发用的好少,几乎都没用过╮(╯_╰)╭
- 同步效率底,安全性高,在需要时我们需要在其中找到平衡点,即是该同步的地方才同步
想说的话
- 博客坚持写,今后学习了新的东西就在这里记录一下,以便今后回顾,也希望小小笔记能帮助你们
- 若内容有什么地方不对、不清楚,还望吐槽,希望大家能一起成长
- 来一句:不做怎么知道呢,试一试吧,做着做着就知道了