Lock锁
源代码:
package cn.ecut.lock;
import java.util.concurrent.locks.ReentrantLock;
/*
synchronized与Lock的对比
①Lock是显示锁(手动开启和关闭锁) synchronized是隐式锁,出了作用域自动释放
②Lock只有代码块锁,synchronized有代码块锁和方法锁
③使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性。(提供更多的子类)
④优先使用顺序:
Lock>同步代码块>同步方法
*/
//测试Lock锁
public class TestLock {
public static void main(String[] args) {
MyLock myLock=new MyLock();
new Thread(myLock).start();
new Thread(myLock).start();
}
}
class MyLock implements Runnable{
private int ticketNums=10;//票数
private final ReentrantLock lock=new ReentrantLock();//定义lock锁
@Override
public void run() {
while (true) {
try{
lock.lock();//加锁
if (ticketNums > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(ticketNums--);
}else{
break;
}
}finally {
//如果同步代码有异常,要将unlock()写入finally语句块
lock.unlock();//解锁
}
}
}
}
运行结果: