ReentrantLock的使用
class x(){
Lock lock = new ReentrantLock();
public void xxx(){
lock.lock();
try{
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
用以下方法使用
new Thread(()->{for(int i=1;i<40;i++) x.xxx();}).start;
Lock锁和Synchronized的区别
- Synchronized 是Java内置关键字 ,Lock锁是一个Java 类;
- Synchronized 无法判断获取锁的状态,Lock可以判断是否获取了锁;
- Synchronized 会自动释放锁,Lock锁就必须手动释放;
- 用Synchronized关键字的两个线程1和线程2,如果线程1获得锁,线程2就会等待。如果线程1阻塞了,线程2就会一直等待下去;但如果是Lock锁线程就不会一直等待下去。
- synchronized 可重入锁,不可中断,非公平;Lock 可重入锁,可以判断锁,可以自行设置是否公平;(公平就是线程先到先被使用,非公平就是谁执行的时间短谁被使用);
- Lock锁:适合大量代码的同步问题,synchronized锁:适合代码少 量的同步问题;
|