多线程之锁

其实常用也就那么几个锁,总感觉线程所用的锁机制和数据库的很相似,什么读写锁,就和数据库的共享锁,排他锁没什么区别.甚至有的文章连名字都一样,因为他们表达的含义是完全一样,而且多说一句,mysql数据库的锁名字真他妈乱.下次好好分析一下.

下面看看线程的锁

1.可重入锁(重要)

这其实是一种属性(可重入性),在线程中只要符合可重入性的锁,都可被称为可重入锁.

可重入锁是一个什么概念呢?

就是一个线程在执行一个,比如被 synchronized 修饰的方法,这时他获得了这个方法的锁了,但是这个方法里面调用了另外一个被synchronized 修饰的方法,他可以直接获取第二个方法的锁,而无需等待.

这样做好处是,预防死锁,比如说,一个线程获取了第一个方法的锁,他还想获取第二个方法的锁,但需要申请,他有可能会永远卡在这(万一第二个被占用了呢),所以他会直接进入第二个方法,不需要获取锁,如果能满足这一点他就是可重入锁.常用的synchronized 和ReentrantLock(就是lock)都是可重入锁.

但是,你发现了一个问题没有,因为第二个方法的锁不需要申请,所以如果有全局变量,就很有可能会出错,所以满足以下几点很重要.

2.可中断锁

就是那种等待锁的过程中,等半可以嫌时间太长不等的锁

3.公平锁

看下面总结来说就是少用synchronized 多用lock锁(哈哈)

4.读写锁(重要)

没有感觉这和数据库的锁简直一模一样吗,关键点就是只要有写,就不行,就只能一个线程来操作.

读写互斥害怕出现脏读(哈哈),线程中没有脏读这个概念哈(我不知道),我知道这是数据库的概念

就是有写的就不能共存,其实也很好理解.

下面看看示例

在下面试验证过程,看看读写锁的过程,可以看看

五.乐观锁与悲观锁

同样这也都是一种概念哈,符合这个概念的就是乐观锁与悲观锁了


说的简单点

悲观锁随时加锁,有一个线程调用锁之后,其他线程就必须等待了.安全性很高,但效率肯定就不好了.

乐观锁:我觉得啊既然无法解决脏读,那就肯定是可以随时获取锁了.

而且啊,这些往往都要和数据库来一起实现,使用数据库的机制来具体实现这些锁机制.因为按他的说法如果不在数据库进行处理,那么即使在系统中进行了锁处理也不能很好的实现.

而且刚好找到了数据库的锁的一些概念,刚好来看看

鄙人感觉这些锁的概念和数据库的锁的概念几乎是一样的,只是应该数据库的锁更为强力一点(也有可能是因为数据库是最后一道防线了),反正所以在实现乐观悲观锁的具体实现中用到了大量数据库的机制.

总之和数据库很相似,我知道的线程常用的锁也就这么多了,下次再好好整理整理数据库的锁机制,好好对比一下.

其实感觉很多具体实现原理还都是不太懂,先把这些基础搞好吧.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 并发编程中最常出现的情形就是多个线程共享一个资源,这些共享的资源很可能导致错误或者数据不一致的情形,需要想办法来解...
    Real_man阅读 324评论 2 0
  • 在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制。Java提供了多种多线程锁机制的实现方...
    千淘萬漉阅读 6,953评论 1 33
  • 1.解决信号量丢失和假唤醒 public class MyWaitNotify3{ MonitorObject m...
    Q罗阅读 902评论 0 1
  • 又一次感到深深地挫败感,婚姻的本质是什么?十几年的婚姻生活,除了失望还是失望,内心的不平衡感一次又一次地出现,就如...
    静冰雨阅读 94评论 0 0
  • Docker阿里镜像加速器 受限于国内的网络情况,在pull官方镜像的时候速度总是很慢,所以需要配置个阿里的镜像加...
    宇行信阅读 9,754评论 0 3