Lock锁
public class TestLock {
public static void main(String[] args) {
Test t1 = new Test();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
}
}
class Test implements Runnable{
int ticketNums = 10;
//定义lock锁
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (true){
try {
lock.lock();//加锁
if (ticketNums > 0){
System.out.println(ticketNums--);
}else {
break;
}
}finally {
lock.unlock();//解锁
}
}
}
}
synchronized锁和Lock锁对比:
-
Lock锁是显式锁(需要手动开锁和关锁,不要忘记关锁),synchronized是隐式锁,出了作用域自动释放。
-
Lock锁只锁代码块,syncronized锁有代码块锁和方法锁。
-
使用Lock锁,JVM将花费较少的是时间;来调度线程,效果更好。并且具有较好的扩展性。
-
优先使用顺序
Lock > 同步块(已经进入了方法体,分配了相应的资源) > 同步方法 (在方法体之外).