Lock锁 ——JDK5.0新增
class Window4 implements Runnable{
private int ticket=100;
//1.实例化ReentrantLock
private ReentrantLock lock=new ReentrantLock();
@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();
}
}
}
}
public class LockTest {
public static void main(String[] args) {
Window4 w1 = new Window4();
Thread s1 = new Thread(w1);
Thread s2 = new Thread(w1);
Thread s3 = new Thread(w1);
s1.setName("窗口一");
s2.setName("窗口二");
s3.setName("窗口三");
s1.start();
s2.start();
s3.start();
}
}
synchronized与Lock的异同
相同点:
- 都可以解决线程安全问题
不同点:
- synchronized机制在执行玩相应的同步代码以后,自动的释放同步监视器
- Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock())