跳转至

Lock锁

一、Lock

解决线程安全问题的方式三:Lock锁 --- JDK5.0新增

class A{

private final ReentrantLock lock = new ReenTrantLock();

public void m(){

lock.lock();

try{

//保证线程安全的代码;

} finally{

lock.unlock();

}

}

}

1. 面试题:synchronized 与 Lock的异同? 相同:二者都可以解决线程安全问题 不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器 Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock()) 2.优先使用顺序: | Lock à 同步代码块(已经进入了方法体,分配了相应资源) à 同步方法(在方法体之外) | |--------------------------------------------------------------------------------------| 面试题:如何解决线程安全问题?有几种方式--3种

package day02.java1;

import java.util.concurrent.locks.ReentrantLock;

public class ThreadTest {

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("窗口1");

t2.setName("窗口2");

t3.setName("窗口3");

t1.start();

t2.start();

t3.start();

}

}

class Window implements Runnable{

private int ticket=100;

private ReentrantLock lock=new ReentrantLock();

@Override

public void run() {

while(true){

try{

lock.lock();

if(ticket>0){

System.out.println(Thread.currentThread().getName()+"售票,排号"+ticket);

ticket--;

}else{

break;

}

}finally {

lock.unlock();

}

}

}

}