Lock锁解决线程安全问题

从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同 步锁对象来实现同步。同步锁使用Lock对象充当

java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的 工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象 加锁,线程开始访问共享资源之前应先获得Lock对象

ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和 内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以 显式加锁、释放锁

class Windows implements Runnable {
     
    private int ticket = 100;
    private ReentrantLock lock = new ReentrantLock(true);// 公平
    // ReentrantLock(false) 等同于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(); // 解锁
            }
        }
    }
}
public class LockTest {
     
    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.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}

公平锁
Lock锁解决线程安全问题_第1张图片
非公平锁
Lock锁解决线程安全问题_第2张图片

你可能感兴趣的:(java,多线程)