解决多线程中线程安全问题方式三
import java.util.concurrent.locks.ReentrantLock; /** * 解决多线程中线程安全问题方式三:调用Lock接口 1.因为Lock是接口,无法直接使用,所以使用Lock的实现类ReentrantLock 2.jdk5后新增的特性 3.lock需要手动调用lock()方法开启同步锁,当同步逻辑完成后,也需要手动调用unlock()方法来结束同步 */ public class LockDemo { public static void main(String[] args) { //实现方式 window1 w1 = new window1(); Thread t1 = new Thread(w1); Thread t2 = new Thread(w1); Thread t3 = new Thread(w1); t1.setName("Implement窗口1"); t2.setName("Implement窗口2"); t3.setName("Implement窗口3"); t1.start(); t2.start(); t3.start(); //继承方式 // window2 w = new window2(); // window2 w2 = new window2(); // window2 w3 = new window2(); // // w.setName("Extends窗口1"); // w2.setName("Extends窗口2"); // w3.setName("Extends窗口3"); // w.start(); // w2.start(); // w3.start(); } } /*实现方式*/ class window1 implements Runnable { private int num = 100; private ReentrantLock lock = new ReentrantLock(); // private ReentrantLock lock = new ReentrantLock(true); //代表公平锁,按照线程进入的先后顺序执行 @Override public void run() { while(true){ try { lock.lock(); if(num > 0){ System.out.println(Thread.currentThread().getName() + "卖票,票号为:" + num); num --; }else{ break; } }finally{ lock.unlock(); } } } } /*继承方式*/ class window2 extends Thread{ private static int num = 100; private static ReentrantLock lock = new ReentrantLock(); @Override public void run() { while(true){ try { lock.lock(); if(num > 0){ System.out.println(Thread.currentThread().getName() + "卖票,票号为:" + num); num--; }else{ break; } }finally{ lock.unlock(); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)