一、公平锁与非公平锁

  线程所谓的公平,就是指的是线程是否按照锁的申请顺序来获取锁,如果是遵守顺序来获取,这就是个公平锁,反之为非公平锁。

  非公平锁的优点在于吞吐量大,但是由于其不是遵循申请锁的顺序来获取锁,就会出现最开始申请的锁一直没有获取到,导致出现饥饿现象。

  java中的使用:

  synchronized:非公平锁

  ReentrantLock:按照其构造方法来指定该锁是否是公平锁,默认是非公平锁

二、共享锁与排他锁

  排他锁:该锁只能被一个线程使用;

  共享锁:该锁可被多个线程所使用;

  java中的使用:

  synchronized:排他锁(这是必然的)

  ReentrantLock:排他锁

  ReadWriteLock:ReadWriteLock中分为读写两个锁,其中读锁是共享锁,写锁是排他锁,这样的好处就是使得这个锁资源利用率高,因为只是读的话不会改变内容。

三、偏向锁、轻量级锁、重量级锁

  这三种只的是锁的状态,并且这三个锁只针对于synchronized

  偏向锁:当其他线程竞争时,才会释放的锁。这个锁的存在是因为获取锁和释放锁是非常浪费资源的,如果只有一个线程,偏向锁是非常好的一个选择。

  轻量级锁:当多线程任务是原子性操作时,可以同时让多个线程进入同步代码块。这锁是由偏向锁中从单线程变成多线程时演变的。

  重量级锁:当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低。

  在JDK5之前,synchronized一直都是重量级锁。

四、锁重入

  锁重入是指在多线程环境中,如果有两个线程A、B,且A、B两个线程都获取了同一把锁,如果此时只有A线程调用了B线程,A会自动获取B中的锁。锁重入的好处是能够避免死锁。

  synchronized与ReentrantLock都是锁重入。

五、自旋锁

  在Java中,自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。

六、死锁、活锁、饥饿

  这三个是线程的状态:

  死锁:当一个线程获取了锁,其他线程也来获取就会发生死锁

  活锁:当两个线程同时获取同一个资源,如果都发现了对方在获取这个资源,那么双方会停止访问又去同时访问另一相同资源,如此反复就产生了活锁。

  饥饿:优先级较低的线程无法执行

七、乐观锁与悲观锁

  悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。

  乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

  java中的使用:

  悲观锁:synchronized

  乐观锁:JDK的原子性操作类java.util.concurrent.atomic

  

  

  

java并发学习第五章--线程中的锁的更多相关文章

  1. java并发学习--第六章 线程之间的通信

    一.等待通知机制wait()与notify() 在线程中除了线程同步机制外,还有一个最重要的机制就是线程之间的协调任务.比如说最常见的生产者与消费者模式,很明显如果要实现这个模式,我们需要创建两个线程 ...

  2. java并发学习--第三章 线程安全问题

    线程的安全问题一直是我们在开发过程中重要关注的地方,出现线程安全问题的必须满足两个条件:存在着两个或者两个以上的线程:多个线程共享着共同的一个资源, 而且操作资源的代码有多句.接下来我们来根据JDK自 ...

  3. java并发学习--第四章 JDK提供的线程原子性操作工具类

    在了解JDK提供的线程原子性操作工具类之前,我们应该先知道什么是原子性:在多线程并发的条件下,对于变量的操作是线程安全的,不会受到其他线程的干扰.接下来我们就学习JDK中线程的原子性操作. 一.CAS ...

  4. java并发学习--第八章 JDK 8 中线程优化的新特性

    一.新增原子类LongAdder LongAdder是JDK8中AtomicLong的增强工具类,它与AtomicLong最大的不同就是:在多线程场景下,LongAdder中对单一的变量进行拆分成多个 ...

  5. java并发学习--第七章 JDK提供的线程工具类

    一.ThreadLocal ThreadLocal类用于隔离多线程中使用的对象,为ThreadLocal类中传递的泛型就是要隔离的对象,简单的来说:如果我们在主线程创建了一个对象,并且需要给下面的多线 ...

  6. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  7. java并发基础(五)--- 线程池的使用

    第8章介绍的是线程池的使用,直接进入正题. 一.线程饥饿死锁和饱和策略 1.线程饥饿死锁 在线程池中,如果任务依赖其他任务,那么可能产生死锁.举个极端的例子,在单线程的Executor中,如果一个任务 ...

  8. Java并发学习之中的一个——线程的创建

    本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.与每一个Java语言中的元素一样,线程是对象.在Java中,我们有两种方式创建线程: a.通过直接继承thread类,然后覆盖run方法. b ...

  9. 《深入理解Java虚拟机》-----第13章 线程安全与锁优化

    概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解 ...

随机推荐

  1. 使用@Test报java.lang.NullPointerException at org.eclipse.jdt.internal.junit4.runner.SubForestFilter.shouldRun(SubForestFilter.java:81)异常

    对公司的项目进行二次开发时,在调试过程中用到@Test注解,运行使发现控制台报空指针异常,如图: 参考网上相应资料后,删除项目中自带的Junit4.jar,然后使用eclipse开发工具自带的Juni ...

  2. cmd开启3389

    如何用CMD开启3389与查看3389端口 开启 REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server / ...

  3. CSS基础-background的那些属性

    background的那些属性 background:背景的意思常用的六个属性 1.background-color:背景颜色 2.background-image:背景图像 3.background ...

  4. php正则匹配汉字提取其它信息剔除和验证邮箱

    正则匹配汉字提取其它信息剔除demo <?php //提取字符串中的汉字其余信息剔除 $str='te,st 测 .试,.,.?!::·…~&@#,.?!:;.……-&@#“” ...

  5. Netflow elasticflow

    http://itfish.net/article/27660.html https://github.com/robcowart/elastiflow/tree/master

  6. vim推荐的光标移动配置文件?

    http://roclinux.cn/?p=1466 inoremap jk inoremap ... 参考较好的vim设置文件 : 共享粘贴板: set clipboard+=unnamed 除了映 ...

  7. python-笔记(四)函数

    一.函数是什么? 函数一次来源于数学,但是编程中的[函数]的概念,与数学中的函数还是有很大的不同的,编程中的函数在英文中也有很多不同的叫法. 在Basic中叫做subroutine(子过程或子程序), ...

  8. 阿里云DNS api接口 shell 更改DNS解析

    可定时任务检查域名解析,调用alidns.sh更新DNS解析 #!/bin/bash # alidns.sh #https://www.cnblogs.com/elvi/p/11663910.html ...

  9. JMeter学习笔记16-如何输出HTML格式的性能测试报告

    文本来学习下,如何输入HTML格式的JMeter测试报告.前面已经介绍, 如果要做性能测试,需要在GUI上设计好你的Test Plan,设置各种场景和负载值,包括多少个线程,多少个用户,循环多少次.设 ...

  10. Java实验报告(一)&&第三周学习总结

    实验报告(一) 1. 打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 源代码: public class Main { p ...