锁的一些理解

##锁的工作原理
在多线程中,使用最多的就是锁了。锁是如何避免多线程资源冲突呢?一开始我的理解是锁作为一种全局变量,只有去读锁的状态,一般来说读读不会冲突,只有读写和写写冲突。后来通过阅读才知道,锁是通过将查询和所属线程的两个步骤在物理方式上作为一个原子操作。即查询该锁的状态以及如果锁处于空闲状态时,将该锁属于本线程是一次性完成的。这样就可以实现锁的范围内安全。
##锁的对象
在多线程程序中,为了避免资源冲突,常常加各种锁。常见的是互斥锁,如何确定使用锁的对象和范围呢?
从锁的用途可以看出是需要根据被保护对象的多少来生成锁的数量(这明显是废话,可是一开始由于理解不对被线程个数所迷惑)。
##锁的范围
结合以往经验来看,锁的范围是越小越好。一来是为了安全,代码异常可能性小;其次,可以提高执行效率,锁的左右就是将本来并行执行的变成串行。如果一个锁的范围内有io等耗时操作将得不偿失。windows语言中Concurrent相关容器就是在内部加锁,缩小了锁的范围从而提高系统的运行。
##死锁
什么情况下会造成死锁,以我遇到两种这里mark一下,第一个是锁的范围太大,锁里面套着其他锁,当线程分开时,很有可能会出现这种一个线程等待里面的锁释放,而另外一个锁等待外面的锁释放,导致死锁。另外一种情况就是锁的范围内异常退出或者有其他返回渠道,特别是一些强制转移的语句,这种情况会导致锁没有被释放,当下次进到该线程时会出现该线程一直等待情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值