面试被经常被问到,做个整理吧。
使用场景:
Synchronized:可以用来修饰方法、代码块,通过做个关键字给访问的资源加锁,只要访问该类或者类方法,就会进入获取锁的流程,代码执行完毕,会自动释放锁。
public class SynchronizedTest {
String eml;
//修饰方法
public synchronized void method(){
//修饰代码块
synchronized(this){
//todo
}
//修饰代码块
synchronized(eml){
//todo
}
}
}
ReentrantLock:先创建一把锁,在需要同步资源状态的地方获取这把锁,获取到后进行资源访问,业务代码执行完毕后,需要释放锁。
public class ReentrantLockTest {
ReentrantLock lock = new ReentrantLock();
public void method() throws InterruptedException {
//获取锁,成功返回true
if(lock.tryLock()){
try{
//todo 业务代码
}finally{
//释放锁
lock.unlock();
}
}
//获取锁,两秒之内获取不到,就会放弃等待。
//if(lock.tryLock(2, TimeUnit.SECONDS))
}
}
总结:ReentrantLock更灵活,tryLoc获取锁会立刻返回结果,Synchronize拿不到会一直等待。