多线程之锁

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

下面看看线程的锁

1.可重入锁(重要)

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

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

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

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

多线程之锁_第1张图片
多线程之锁_第2张图片
多线程之锁_第3张图片

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

多线程之锁_第4张图片
多线程之锁_第5张图片

2.可中断锁

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

多线程之锁_第6张图片

3.公平锁

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

多线程之锁_第7张图片

4.读写锁(重要)

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

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

多线程之锁_第8张图片

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

下面看看示例

多线程之锁_第9张图片
多线程之锁_第10张图片

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

多线程之锁_第11张图片
多线程之锁_第12张图片

五.乐观锁与悲观锁

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


多线程之锁_第13张图片

说的简单点

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

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

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

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

多线程之锁_第14张图片

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

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

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

你可能感兴趣的:(多线程之锁)