<Java>多线程——Lock锁方式解决线程安全问题

news/2024/10/23 9:32:57/

Lock接口提供了与synchronized关键字类似的同步功能

synchronized 方法或语句的使用提供了对与每个对象相关的隐式监视器锁定的访问,但却强制所有锁定获取和释放均要出现在一个块结构中:当获取了多个锁定时,它们必须以相反的顺序释放,且必须在与所有锁定被获取时相同的词法范围内释放所有锁定。

虽然synchronized方法和语句的范围机制使得使用监视器锁定编程方便了很多,而且还帮助避免了很多涉及到锁定的常见编程错误,但有时也需要以更为灵活的方式使用锁定。例如,某些遍历并发访问的数据结果的算法要求使用 “hand-over-hand” 或 “chain locking”:获取节点 A 的锁定,然后再获取节点 B 的锁定,然后释放 A 并获取 C,然后释放 B 并获取 D,依此类推。Lock 接口的实现允许锁定在不同的作用范围内获取和释放,并允许以任何顺序获取和释放多个锁定,从而支持使用这种技术。

ReentrantLock构造方法

  • ReentrantLock():构建一个ReentrantLock的实例,这等同于使用 ReentrantLock(false)

  • ReentrantLock(boolean fair): 创建一个具有给定公平策略的 ReentrantLock
    参数:
    fair - 如果此锁定是公平的,则该参数为 true;否则为false

使用方式


Lock lock=new ReentrantLock();   //显式的获取锁
lock.lock();
try
{// access the resource protected by this lock//处理逻辑
}
finally
{lock.unlock();   //显式的释放锁
}

例题:多窗口售票问题

class lockThread implements Runnable
{private int tickets=100;//实例化ReentrantlockLock lock=new ReentrantLock();  //默认false,非公平锁public void run(){while(true){lock.lock();   //上锁try {if (tickets > 0) {System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + (100 - tickets + 1));tickets--;} else {break;}}finally {lock.unlock();    //释放锁}}}
}

synchronized与Lock异同

相同:二者都可以解决线程安全问题

不同synchronized机制在执行完相应同步代码后,会自动释放同步监视器;Lock需要手动获得锁(lock()),手动释放锁(unlock()


http://www.ppmy.cn/news/195082.html

相关文章

北京城里有900万辆自行车

There are nine million bicycles in Beijing 北京城里有900万辆自行车Thats a fact 这是个事实Its a thing we cant deny 是我们无法否认的事Like the fact that I will love you till I die 就像我会爱你直到死去 We are twelve billion light years from the edge 我们…

倍受歧视的北京骑车人

倍受歧视的北京骑车人 标签:杂谈 天冷的时候我每天都在坐公交车上下班,加上很多时间都在车上打盹,对于骑车没有很深的感觉,但是天气转暖后,实在难以忍受热的要死的车厢和在因为道路拥堵 车里漫长的等待,并且…

共享单车公司每年花上亿元赎车

来源|36氪Pro 编辑|杨林 杨轩 当王萧风尘仆仆赶到现场时,发现一辆大型厢货正停在路中央,一些陌生人正在把他的单车不停往上运——这是共享单车行业折腾到第六年,出现的一个新群体:第三方“扣车公司”。王萧…

小蜜单车 免费骑车 BUG

前段时间 杭州出现了 很多的小蜜单车. 电动的 骑起来非常的方便. 有一天偶然发现一个BUG,竟然可以免费骑车. 骑了不少次,算是受了不少恩惠了, 写个软文分享下,算是报答了. 当然我8月1号上报BUG了, 客服表示这是不可能的, 不会把我当傻子了吧,仁至义尽了,分享下BUG给各位吧,让各…

隔壁王大爷都弄明白了“锁“——java锁机制(实现原理)

终于明白了JavaAPI里面的锁 锁的出现: 第一次接触到锁的概念是在java多线程遇见的锁,再写多线程用到了synchronized和lock两种锁,采用锁是为了保证线程的安全,每个线程都存在自己私有和共有的数据区,私有的数据区只对内…

【Java多线程】你了解死锁吗?【Lock锁】

➤ Java多线程编程【一文全解】 文章目录 01 什么是死锁?02 如何避免死锁?03 Lock 锁 01 什么是死锁? 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放…

JavaEE多线程中的 死锁 可重入锁和内存可见性问题

文章目录 死锁 可重入锁内存可见性问题解决内存可见性问题的方案总结 死锁 可重入锁 一个线程,连续针对一把锁,加锁两次,就可能造成死锁 形如上述代码,一个线程针对一把锁,连续枷锁两次,第一次加锁,能够加锁成功 第二次加锁,就会加锁失败(锁已经被占用) 就会在第二次加锁这里…

Java多线程06—用Lock锁解决线程的安全问题

解决线程安全问题的方式三:Lock锁 文章目录 解决线程安全问题的方式三:Lock锁Lock锁synchronized 与 Lock 的对比优先使用顺序(建议) 练习题 Lock锁 (jdk5.0后的方式) 从JDK 5.0开始,Java提供了更强大的线程同步机制…