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--->同步代码块(已经进入了方法体,分配了相应的资源)--->同步方法(在方法体之外)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~