java锁+操作系统锁

本文探讨了在操作系统和Java中实现线程安全的方法,包括分析lost wake-up问题的可能性、操作系统如何通过信号量机制保证锁的安全性,以及讨论了自旋锁的工作原理和优势。同时提到了Java中的线程与锁的实现,并推荐了一篇相关的CSDN博客链接。
摘要由CSDN通过智能技术生成

记一次lost wake-up问题

这个问题是在测试操作系统中信号量机制对进程的控制中发现的,其实还是对多线程了解的太少了。

 

问题一:int idx=100000,然后我们每一个进程都idx--,是否会出现A进程取出idx=100的同时B也取出来idx=100,然后各自--再放回去,idx==99而不是idx=98?

尽管计算机计算的速度非常快,但这个问题还是会发生的!不信你试试,记得idx设的大一点。

 

问题二:有关操作系统中线程的切换

操作系统可以通过信号量机制的pv操作来实现锁的机制(可以忽略)。那么操作系统是怎样保证锁的安全性的呢?

1:关中断:

适用于单核,因为多核的话,即使你把中断关了,保证了该线程开关锁这一段的原子性,但是还是会有其他的处理器访问到这些资源。并且开关中断实在是太浪费时间了。

2:test-and-set( 自旋锁 ):

1:定义:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。

2:个人关于自旋锁当时的一个疑问:自旋锁不也是通过汇编语句来写的,那Test_And_Set_Lock读取lock并且执行的过程不也应该是不能保证原子性的吗?

其实不是,为啥test-and-set叫硬同步,因为Test_And_Set_Lock读取lock并且执行的过程是硬件保证了原子性,具体是怎样保证的我也不太晓得。

3:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值