lock锁

java.util.concurrent.locks.lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作。同步代码块/同步方法具有的功能lock都有,除此之外更强大更体现面向对象。

使用步骤:
1.在成员位置创建一个Reentrantlock对象
2.在可能出现安全问题的代码前调用Lock接口中的方法Lock()获取锁
3.在可能出现安全问题的代码后调用Lock接口中方法unLock() 释放锁

首先创建RunnableImp类:
package demo09线程安全lock锁; import java.util.concurrent.locks.Lock; import
java.util.concurrent.locks.ReentrantLock; //实现买票案例 //卖票出现了线程安全问题:卖出了不存在的票和重复的票
//使用线程安全的一种方案:lock锁 /* java.util.concurrent.locks.lock.lock接口
Lock实现了提供了比使用synchronized方法和语句可获得更广泛的锁操作 Lock接口中的方法: void Lock() 获取锁 void
unLock() 释放锁 Reentrantlock是Lock接口的一个实现类 使用步骤: 1.在成员位置创建一个Reentrantlock对象
2.在可能出现安全问题的代码前调用Lock接口中的方法Lock()获取锁 3.在可能出现安全问题的代码后调用Lock接口中方法unLock() 释放锁 */
public class RunnableImp implements Runnable { //定义一个多线程共享的票源 private int
ticket=100; //1.在成员位置创建一个Reentrantlock对象 Lock L=new ReentrantLock(); //创建一个锁对象
Object obj=new Object(); //定义线程任务:买票 @Override public void run() {
//使用死循环让卖票重复执行 while(true){ //2.在可能出现安全问题的代码前调用Lock接口中的方法Lock()获取锁 L.lock();
//先判断票是否存在 if(ticket>0){ //为了提高安全问题出现的次数。让程序睡眠一下,输出慢一点 try { Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+"---正在卖票"+ticket+"张票");
ticket--; } catch (InterruptedException e) { e.printStackTrace(); }finally{
//3.在可能出现安全问题的代码后调用Lock接口中方法unLock() 释放锁 L.unlock();//无论程序是否出现异常,都会把锁释放掉 } } }
} }
再创建Ticket类:
package demo09线程安全lock锁; import demo06线程安全.RunnableImp; //模拟买票案例,对共享的票进行出售
public class Ticket { public static void main(String[] args) { //创建接口的实现类对象
RunnableImp run =new RunnableImp(); //创建Thread类对象,构造方法中传递Runnable接口对象 Thread
t0=new Thread(run); Thread t1=new Thread(run); Thread t2=new Thread(run);
//开启线程 t0.start(); t1.start(); t2.start(); } }
结果:

 

技术
©2019-2020 Toolsou All rights reserved,
在算法研究过程中如何进行算法创新七大排序算法(java代码)MYSQL中的索引与事务———javaweb(8)(面试必考)2022蓝桥杯JavaB组省赛试题网络安全-wifi攻防网络层协议——ICMP协议MySQL查询表中指定条件下的最新记录JavaSE笔记(一)Java基础语法mysql 查询条件之外的数据_mysql 查询符合条件的数据qt使用数据库sqlite