解决线程安全的方式三 Lock锁 JDK5.0新增
package com.chen.lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockTest01 {
public static void main(String[] args) {
Windows w = new Windows();
Thread t1 = new Thread(w);
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.start();
t2.start();
t3.start();
}
}
class Windows implements Runnable {
private int ticket = 100;
//1.实例化对象
private ReentrantLock lock = new ReentrantLock(true);
@Override
public void run() {
while (true) {
try {
//2.调用lock
lock.lock();
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖票:票号为" + ticket);
ticket--;
} else {
break;
}
} finally {
//3.调用解锁
lock.unlock();
}
}
}
}
面试题
synchronized与lock的异同
相同:两者都可以解决线程安全问题
不同点:synchronized机制在执行完相应的同步代码后,自动的释放同步监视器
lock需要手动的启动同步,同时结束同步也需要手动的实现
优先使用顺序
Lock 同步代码块 同步方法