Lock锁解决线程安全问题
Lock(锁):
从jdk5.0开始,Java提供了更强大的线程同步机制——通过显示定义同步锁对象来实现同步。同步锁使用Lock对象充当。
java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对L ock对象加锁,线程开始访问共享资源之前应先获得Lock对象。
ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock, 可以显式加锁、释放锁。
import java.util.concurrent.locks.ReentrantLock; public class LockTest { public static void main(String[] args) { Windows2 windows2 = new Windows2(); Thread thread1 = new Thread(windows2,"窗口一"); Thread thread2 = new Thread(windows2,"窗口二"); Thread thread3 = new Thread(windows2,"窗口三"); thread1.start(); thread2.start(); thread3.start(); } } class Windows2 implements Runnable { private int ticket = 100; //第一步:实例化ReentrantLock private ReentrantLock lock = new ReentrantLock(true); @Override public void run() { while (true){ try { //第二步:调用锁定方法Lock lock.lock(); if (ticket>0){ System.out.println(Thread.currentThread().getName()+":票号"+ticket); --ticket; }else { break; } }finally { //第三步:调用解锁方法:unlock lock.unlock(); } } } }
synchronized和Lock的异同:
相同之处:二者都可以解决线程安全问题
不同之处:synchronized机制在执行完响应的同步代码以后,自动的释放同步监视器
lock需要手动启动同步(lock()方法),同时结束同步也需要手动的实现(unlock()方法)
建议优先使用顺序:lock--->同步代码块(已经进入了方法体,分配了相应的资源)--->同步方法(在方法体之外)

浙公网安备 33010602011771号