Lock: 接口
ReentrantLock类实现了Lock,常用实现类
构造器分为有参数和无参数,有参数的如果传入true,说明线程是公平的,先进先出,不会出现一个线程刚进入再次进入的现象,传入false则没有上述功能。
1.实例化ReentrantLock
2.调用lock(),必须紧跟在try后面
3.调用unlock()
public class LockTest {
public static void main(String[] args) {
Window window = new Window();
Thread t1 = new Thread(window);
Thread t2 = new Thread(window);
Thread t3 = new Thread(window);
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
t1.start();
t2.start();
t3.start();
}
}
class Window implements Runnable{
private static int ticket = 100;
//1
private ReentrantLock lock = new ReentrantLock(true);
@Override
public void run() {
while(true){
try {
//2
lock.lock();
if(ticket > 0){
System.out.println(Thread.currentThread().getName() + "售出票号为:" + ticket);
ticket--;
}else{
break;
}
} finally {
//3
lock.unlock();
}
}
}
}
synchronized与Lock的异同?
同:两者都是为解决线程安全问题
异:synchronized机制在执行完相应的同步代码块后,自动释放同步监视器
Lock需要手动启动同步和结束同步。建议使用Lock->同步代码块->同步方法