1.步骤:
1⃣️实例化ReentrantLock
private ReentrantLock lock=new ReentrantLock(true);
如果不加true,则默认为false
2⃣️调用Lock()方法
lock.lock();
3⃣️调用解锁的方法
lock.unlock();
举例:
public class LockTest {
public static void main(String[] args){
Window w=new Window();
Thread t1=new Thread(w);
Thread t2=new Thread(w);
Thread t3=new Thread(w);
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
t1.start();
t2.start();
t3.start();
}
}
class Window implements Runnable{
private int ticket=100;
//1.实例化ReentrantLock
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();
}
}
}
}
2.synchronized与Lock的异同:
(1)相同:
1⃣️二者都可以解决线程安全问题。
不同:
1⃣️synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器。
Lock需要我们手动的启动同步lock()
,同时结束同步也需要手动的实现unlock()
。