引入锁概念

代码:

package com.audition.lock;import java.util.concurrent.atomic.AtomicInteger;/*** Created with IntelliJ IDEA.** @Auther: 两杯水* @Date: 2021/03/03/11:15* @Description:*/
public class A {int num = 0;public long getNum(){return num;}/***,0.无锁控制,多线程情况下回出现问题*/public void incu0(){num ++;}/*** 1.有锁控制:锁住的是incu1这个内部方法*/public synchronized void incu1(){num ++;}/*** 2.有锁控制:锁住的是incu2这个内部方法,this是代表了incu2,此方法和1中直接在方法上加synchronized意义一样*/public  void incu2(){synchronized (this){num ++;}}/*** 3.有锁控制:锁住的是整个A类,*/public synchronized static void incu3(){}/*** 4.有锁控制:锁住的是整个A类,和3等同*/public  void incu4(){synchronized (A.class){num ++;}}/*** 5.使用的是Atomic下的类,效率高,底层用了CAS操作,比较并交换*/AtomicInteger atomicInteger =  new AtomicInteger();public long getNum1(){return atomicInteger.get();}public  void incu5(){atomicInteger.incrementAndGet();}
}

synchronized

synchronized在锁this对象后,线程只会有一个能拿到this对象访问权限,执行其中的代码,其余的代码则等待。

等待时,其他线程干什么去了?

JDK1.6以前,在一个线程拿到锁执行代码后(Monitor),其他线程会放到一个队列中,等待线程1释放锁,这样实现性能就会有问题。性能有问题的原因:
1.放在队列中的线程需要被唤醒
2.线程有可能会被阻塞
3.上下文切换
4.操作系统线程的调度JDK1.6以后,引入了集成了集中状态,无状态、偏向锁、轻量级锁、重量级锁
优化原因:在jvm执行时,通常一个代码块可能在一个线程访问了很多次之后,才会有另一个线程过来访问,这样从一开始就对线程加锁就会很耗费资源,造成性能损耗,所以要优化加锁机制
优化:
偏向锁:在线程内部写一个ID(写在mark word里面的偏向锁标记位,里面有是否启用偏向锁标识0和1),下次释放完锁,之后线程又来加锁,不要做其他操作,比较下线程内部ID,如果一样,直接让线程执行。
轻量级锁:如果有多个线程来加锁,cas操作,让多个线程来争抢。
重量级锁:如果线程数量很多,很多线程都在cas外空转(线程比较少,但是空转时间长也会升级为重量级锁),会导致cpu损耗,这个时候就要用到重量级锁。放到队列中去由于轻量级锁在进行cas操作时,另一个线程在外空转时间过长,就会引入重量级锁,所以引入另一种JDK未实现的优化,如下:
使用longAdder底层-分段CAS锁机制
分段CAS锁机制:多个线程访问同一个资源时,当一个线程在堆资源进行操作,其他线程来执行代码,底层把把资源复制为一个相同数据数组,让其他线程来访问服务出的数据资源。当线程数不多时,减少已复制的数据数组。

轻量级锁一定比重量级锁性能高?

不一定,轻量级锁如果争抢锁的时间过多,也可能会造成过多的性能损耗。

CAS:

无锁。自旋锁。乐观锁。轻量级锁

1.容易造成ABA问题:**解释:两个线程同时访问同一个内存数据,A线程短时间内修改了内存中的数据两次,一次修改为其他值,一次修改回原                      值。B再去修改,没有发现数据修改了,直接改变为其他值了。****解决:加版本号控制**2.原子性问题:**AtomicInteger解决方式:JAVA源代码,C++底层代码:lock cmpxchgq 来判断机器是否是多核,如果是,就在比较之前上             把缓存或者总线锁。**

java-锁_自我理解相关推荐

  1. java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    synchronized 和 Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同 ...

  2. java 自旋锁与互斥锁_如何理解自旋锁和互斥锁?

    1.Python多线程run方法的中使用while循环时,如果在循环体没有使用停止程序机制,会一直运行下去.因此楼主如果想让编码方式得当,可以使用信号量或者其他变量机制通知循环体停止,或者判断队列是否 ...

  3. java 枚举_深入理解Java枚举

    所有知识体系文章,[GitHub](https://github.com/Ziphtracks/JavaLearningmanual)已收录,欢迎Star!再次感谢,愿你早日进入大厂! https:/ ...

  4. java 注解_怎样理解 Java 注解和运用注解编程?

    怎样理解 Java 注解和运用注解编程? 注解和使用 先来看下概念首先从注释来看: 注释:给代码添加说明和解释,注释帮助开发人员理解程序.(Comment)说白点就是注释是给人看的. 注解:给代码添加 ...

  5. java 部分正确性_深入理解java快速排序的正确性

    说起快速排序,很多人都能够写出一个正确的快速排序,但就快速排序的正确性,就无从探究了.为什么说写出来的快速排序就是正确的.在快速排序中间的关键几步,以什么样的数据组织来保障快速排序的正确性.本文以&l ...

  6. 如何理解java反射_怎么理解java反射

    怎么理解java反射? 概述 Java 反射是可以让我们在运行时获取类的方法.属性.父类.接口等类的内部信息的机制.也就是说,反射本质上是一个"反着来"的过程.我们通过new创建一 ...

  7. vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...

    本套课程从虚拟机的发展历史,虚拟机的内存结构,对象的分配与回收以及字节码,类加载等多个方面深入地对Java虚拟机进行了剖析.内容详实,语言通俗易懂.理论结合实践,让学习本套视频的朋友可以更快的理解虚拟 ...

  8. 深入理解java虚拟机_深入理解Java类加载

    本文目的: 深入理解Java类加载机制; 理解各个类加载器特别是线程上下文加载器; Java虚拟机类加载机制 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最 ...

  9. Java继承_深入理解Java继承、封装、多态的实现原理

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...

  10. 虚拟机实现java线程_深入理解java虚拟机(23):java与多线程

    线程有以下三种实现方式 1.使用内核线程方式实现,优点内核完成线程切换和操纵调度器进行调度,并且负责将线程任务映射到处理器上.程序一般不使用内核线程会使用一种轻量级进程,轻量级进程与内核线程一对一模型 ...

最新文章

  1. [JLOI 2011]飞行路线[USACO 09FEB]Revamping Trails
  2. 中粮集团对话农民丰收节交易会-万祥军:订单农业丰收经
  3. 【机器学习基础】时间序列测试题的40题,看看你对时间序列的了解水平
  4. androidstudio调用系统相机为什么resultcode一直返回0_函数递归调用?看这文就够了...
  5. NGINX 结合 lua 动态修改upstream
  6. 股票自动交易软件API使用流程
  7. 等级保护三级测评-----云计算安全扩展要求
  8. 使用IDM的正确姿势
  9. 安卓Camera屏幕竖屏适配
  10. LAME 使用/参数说明, 很好的程序
  11. java大作业私人管家系统_微软蓝天云平台:中小企业的私人管家
  12. 循环卷积和线性卷积的关系
  13. ctf-web入门-php特性
  14. JAVA NIO:NIO与OIO的对比以及Channel通道、Selector选择器、Buffer缓冲区的介绍 高并发
  15. 外贸邮箱,公司邮箱都什么格式?公司邮箱如何管理?
  16. (动归三剑客)打家劫舍 (动归三剑客)
  17. JavaWeb开发框架
  18. 【图基础】最佳入门课程:图卷积神经网络(中科院 计算所 沈华伟)
  19. java通过控制台实现打字小游戏
  20. 钓鱼篇-利用RLO隐藏exe文件捆绑office免杀-远程模板加载上线CS

热门文章

  1. js判断IE浏览器(包括IE11)
  2. Java—九九乘法表
  3. 蓝牙耳机音质变差或许该注意这些问题,学生党什么牌子蓝牙耳机性价比高?
  4. [Client]前端代码规范 及 最佳实践
  5. 确定权重方法之一:主成分分析
  6. uni-app下载图片到系统相册
  7. (附源码)SSM 汽车停车位共享APP 毕业设计 041534
  8. Java集合可分成什么类_java.util包含Java中大量工具类、集合类等,例如Arrays、List、Set等。...
  9. 大数据分析师高级证书_大数据分析师(ACP)认证考试大纲
  10. PDF电子发票内容提取