package demo2; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /* * 解决线程安全 * java.util.concurrent.Locks.Locks接口 * Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作 * Lock 接口中的方法: * void Lock()获取锁。 * void unlock() 释放锁 *java.util.concurrent.Locks.ReentrantLock implements Lock 接口 * 使用步骤: * 1.在成员位置创建一个ReentrantLock对象 * 2.在可能会出现安全问题的代码前调用Lock接口中的方法Lock获取锁 * 3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁 * */ public class Demorunnable implements Runnable { //定义一个多个线程共享的票源 private static int ticket = 100; //在成员位置创建一个ReentrantLock对象 Lock l = new ReentrantLock(); //设置线程任务 @Override public void run(){ System.out.println("this:"+this); while (true){ payTicketStatic(); } } public void payTicketStatic(){ l.lock(); if (ticket > 0) { try { Thread.sleep(10); System.out.println("系统正在出售第" + ticket + "张票"); ticket--; } catch (InterruptedException e) { e.printStackTrace(); } finally { l.unlock(); } } //在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁 } }
package demo2; public class Demomainrunnable { public static void main(String[] args) { Demorunnable run = new Demorunnable(); Thread t0 = new Thread(run); Thread t1 = new Thread(run); Thread t2 = new Thread(run); t0.start(); t1.start(); t2.start(); } }