多线程part6-线程安全
同步代码块解决线程安全问题
当多个线程操作同一数据时会出现问题
会出现多次相同,会超过范围
线程执行代码时,cpu执行权随时有可能被其他线程抢走
所以我们需要把操作共享数据的代码锁起来
需要一个关键字 Synchronized(锁对象){执行代码}
特点一:锁状态默认打开,但一个线程进去了,锁自动关闭
特点二:当里面的代码全部执行完毕,线程出来,锁自动打开
特点三:锁对象一定要是唯一的,可在前面static
细节:
锁对象如果不是唯一,那就没有意义,因为线程对应的锁都不一样
一般会写当前类的字节码文件,类名.class
同步方法:
直接把Synchronized 加到方法上
public synchronized 返回值类型 方法名(方法参数){}
特点一:同步方法锁住方法里所有的代码
特点二:锁对象不能自己指定,这是锁对象由java决定
java规定:非静态方法,锁对象是this,当前方法的调用者;
静态方法:当前类的字节码文件对象
Lock锁
为了更清楚的表达如何加锁和释放锁,JDK5之后提供了新的锁对象Lock
它提供了获得锁和释放锁的方法,使得我们可以手动上锁,手动释放锁
注意:Lock是接口不能直接实例化创造对象,要通过它的实现类ReentrantLock来实例化
Lock lock = new ReentrantLock();