目录
1.什么是线程安全问题?
多个线程同时访问一个资源(变量、代码块、数据等),可能出现线程同步问题
多个线程的执行是抢占式的,一个线程在执行一系列程序指令中途时,就被其它线程抢占,可能导致数据状态出现问题。
解决方式:锁机制
2.锁机制
synchronized 关键字
实现锁机制,可以用于修饰方法或代码块
提升数据的安全性,降低性能
2.1同步方法
public synchronized 修饰符 方法名(...){
...
}
当第一个线程进入方法后,自动上锁,其它线程访问不了,前面线程执行完方法后,自动释放锁,其它线程就可以访问
2.2同步代码块
synchronized(锁对象){
....
....
}
锁对象:
1. 任意的Java对象都可以作为锁
2. 不能是局部变量
2.3同步锁
在并发包 java.concurrent.lock下存在大量的锁
Lock接口:
- lock() 上锁
- unlock() 解锁
常见的实现类:
-
ReentrantLock 重入锁
-
ReadLock 读锁
-
WriterLock 写锁
语法:
Lock lock = new ReentrantLock(); //成员变量
方法内:
try{
lock.lock();
同步的代码
}finally{
lock.unlock();
}
3.同步方法和同步代码块的区别
1.语法不同,一个写在方法上,一个写在方法内部
2.锁粒度不同,同步方法作用于整个方法,同步代码块作用于一段代码
3.性能不同,同步方法低于同步块
4.锁对象不同,同步方法是固定的,静态就是类.class,非静态的就是this
同步代码块可以指定锁对象
4.synchronized 锁机制的原理
通过监视器(monitor)完成
当对方法或一段代码上锁后,会启动监视器对这段代码监控,监视器中有计数器,当计数器为0时,允许线程进入,线程进入后,计数器加1,其它线程访问时,计数器不为0,不允许线程进入,线程执行完代码块后,计数器减1为0 ,监视器允许其它线程进入。
5.synchronized和同步锁的区别?
上锁:synchronized是自动上锁和解锁,同步锁是手动完成的
性能:同步锁的性能高于synchronized
使用:synchronized使用简单,功能单一,同步锁提供更多方法,使用灵活