Java不仅提供了 synchronized 用来作为锁 而且还提供了 Lock()作为锁 二者的不同点在于 后者实现的是显式的进行锁的添加与解除 并且只能够作用于代码块 ,但是可以使得cpu进行更好的调度 提高相应的性能。 但是前者的优点在于 不仅能够对代码块进行加锁,还能够对方法进行加锁。
import java.util.concurrent.locks.ReentrantLock;
public class TestLock {
public static void main(String[] args) {
TestLock2 testLock2=new TestLock2();
new Thread(testLock2).start();
new Thread(testLock2).start();
new Thread(testLock2).start(); //没有添加锁 会有线程不安全的情况出现就是
}
}
class TestLock2 implements Runnable{
int tickets=10;
private final ReentrantLock lock =new ReentrantLock(); //定义锁 Lock() 就是我们可以显示的加上锁或者揭开锁
@Override
public void run() {
while(true){
try {
lock.lock();
if(tickets>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tickets--);
}else{
break;
}
} finally {
lock.unlock(); //实现解锁 lock就是可以实现显示的添加锁与去掉锁
}
}
}
}