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--->同步代码块(已经进入了方法体,分配了相应的资源)--->同步方法(在方法体之外)

posted @   羽十六  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示