多线程之锁

作者: 最深的爱最沉默_a447 | 来源:发表于2018-06-02 22:59 被阅读14次

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

下面看看线程的锁

1.可重入锁(重要)

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

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

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

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

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

2.可中断锁

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

3.公平锁

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

4.读写锁(重要)

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

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

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

下面看看示例

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

五.乐观锁与悲观锁

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

说的简单点

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

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

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

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

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

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

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

相关文章

  • 2018-07-26 CountDownLatch

    【转】Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例

  • 起底多线程同步锁(iOS)

    起底多线程同步锁(iOS) 起底多线程同步锁(iOS)

  • 2018-03-01

    随记 1.多线程锁机制之ReentrankLock可重入锁2.RabbitMQ实现消息优先级机制 概况 粗略理解为...

  • 浅析乐观锁、悲观锁与CAS

    乐观锁与悲观锁 处理多线程并发访问最常用的就是加锁,锁又分成乐观锁和悲观锁。 悲观锁 在多线程访问共享资源时,同时...

  • 多线程与锁

    多线程与锁

  • 多线程 (三)iOS中的锁

    ios 多线程--锁

  • 多线程(四)

    上篇多线程(三)我们看了多线程的安全隐患 以及各种锁的简单使用,接下来我们来看看锁的比较、以及自旋锁、互斥锁比较 ...

  • 解决线程同步的方案汇总总结

    这是一篇继上一篇继续介绍多线程同步的博客.(你了解多线程自旋锁、互斥锁、递归锁等锁吗?[https://www.j...

  • 多线程锁之 Synchronized

    Synchronized 基本语法 synchronized 有三中方式加锁: 修饰实例方法,作用于当前实例加锁,...

  • OC--各种线程锁

    参考:正确使用多线程同步锁@synchronized()iOS中的锁iOS多线程安全详解iOS 常见知识点(三):...

网友评论

    本文标题:多线程之锁

    本文链接:https://www.haomeiwen.com/subject/qewfsftx.html