Lock的应用
Lock锁的性能要比synchronized高,但是lock要求必须手动释放锁;
语法格式:
try{ xxx.lock(); //要保护的代码 }finally{ xxx.unlock(); }
lock是个接口,常用的是实现类,ReentrantLock
class ThreadMain{
public static void main(String[] args) {
//演示lock锁
Runnable runnable = new Runnable() {
private int id = 0;
//Lock锁是一个接口,我们使用最多的是他的实现类ReentrantLock
//所以这里我们先创建一个对象
private Lock lock = new ReentrantLock();
@Override
public void run() {
while(id<1000){
try{
//加锁
lock.lock();
if(id<1000){
id++;
System.out.println(Thread.currentThread().getName()+id);
}
}finally {
//释放锁,最终会执行
lock.unlock();
}
}
}
};
//第一个线程
Thread thread = new Thread(runnable);
thread.setName("一:");
thread.start();
//第二个线程
Thread thread1 = new Thread(runnable);
thread1.setName("二:");
thread1.start();
//第三个线程
Thread thread2 = new Thread(runnable);
thread2.setName("三:");
thread2.start();
}
}
【注意】
无论使用那种锁,要想起到保护作用,需要确保线程共有一把锁;
Synchronized和lock的区别
①Synchronized:
<1>底层实现:指令码 控制锁,映射为字节码:monitorenter和monitorexit
<2>关键字
<3>自动释放锁,中途不能打断
②lock:
<1>底层实现:给予CAS乐观锁CLH队列实现
<2>java中的接口
<3>手动释放锁,中途还可以打断;