其实常用也就那么几个锁,总感觉线程所用的锁机制和数据库的很相似,什么读写锁,就和数据库的共享锁,排他锁没什么区别.甚至有的文章连名字都一样,因为他们表达的含义是完全一样,而且多说一句,mysql数据库的锁名字真他妈乱.下次好好分析一下.
下面看看线程的锁
1.可重入锁(重要)
这其实是一种属性(可重入性),在线程中只要符合可重入性的锁,都可被称为可重入锁.
可重入锁是一个什么概念呢?
就是一个线程在执行一个,比如被 synchronized 修饰的方法,这时他获得了这个方法的锁了,但是这个方法里面调用了另外一个被synchronized 修饰的方法,他可以直接获取第二个方法的锁,而无需等待.
这样做好处是,预防死锁,比如说,一个线程获取了第一个方法的锁,他还想获取第二个方法的锁,但需要申请,他有可能会永远卡在这(万一第二个被占用了呢),所以他会直接进入第二个方法,不需要获取锁,如果能满足这一点他就是可重入锁.常用的synchronized 和ReentrantLock(就是lock)都是可重入锁.
但是,你发现了一个问题没有,因为第二个方法的锁不需要申请,所以如果有全局变量,就很有可能会出错,所以满足以下几点很重要.
2.可中断锁
就是那种等待锁的过程中,等半可以嫌时间太长不等的锁
3.公平锁
看下面总结来说就是少用synchronized 多用lock锁(哈哈)
4.读写锁(重要)
没有感觉这和数据库的锁简直一模一样吗,关键点就是只要有写,就不行,就只能一个线程来操作.
读写互斥害怕出现脏读(哈哈),线程中没有脏读这个概念哈(我不知道),我知道这是数据库的概念
就是有写的就不能共存,其实也很好理解.
下面看看示例
在下面试验证过程,看看读写锁的过程,可以看看
五.乐观锁与悲观锁
同样这也都是一种概念哈,符合这个概念的就是乐观锁与悲观锁了
说的简单点
悲观锁随时加锁,有一个线程调用锁之后,其他线程就必须等待了.安全性很高,但效率肯定就不好了.
乐观锁:我觉得啊既然无法解决脏读,那就肯定是可以随时获取锁了.
而且啊,这些往往都要和数据库来一起实现,使用数据库的机制来具体实现这些锁机制.因为按他的说法如果不在数据库进行处理,那么即使在系统中进行了锁处理也不能很好的实现.
而且刚好找到了数据库的锁的一些概念,刚好来看看
鄙人感觉这些锁的概念和数据库的锁的概念几乎是一样的,只是应该数据库的锁更为强力一点(也有可能是因为数据库是最后一道防线了),反正所以在实现乐观悲观锁的具体实现中用到了大量数据库的机制.
总之和数据库很相似,我知道的线程常用的锁也就这么多了,下次再好好整理整理数据库的锁机制,好好对比一下.
其实感觉很多具体实现原理还都是不太懂,先把这些基础搞好吧.