首页 > 编程语言 >【Java】回顾一下Java中的synchronized

【Java】回顾一下Java中的synchronized

时间:2022-11-13 22:00:26浏览次数:44  
标签:加锁 Java synchronized 回顾 对象 代码 升级 线程

synchronized在JDK1.5之前是一个重量级锁,相当于JUC里面的lock锁,但是在1.6版本及之后对它做了很大的升级和优化,它不在那么的笨重了。

synchronized的作用主要有三个: 原子性:确保线程互斥的访问同步代码。 可见性:保证共享变量的修改能够及时可见 有序性:有效解决重排序问题,即一个unlock操作先行发生于后面对同一个锁lock操作。

synchronized的使用

synchronized的三种使用方式:

  • 修饰实例方法:作用于当前实例加锁。 代码里面是在方法前面加上synchronized,就是publich后加上synchronized,代码实例如下:
public synchronized method(){
  // todo 实现方法
}

修饰静态方法:作用于当前类对象加锁 静态方法是属于类而不是对象的。同样的synchronized修饰的静态方法说的是这个类的所有对象

public synchronized static void method() {
   // todo
}

修饰代码块:指定加锁对象,对给定对象加锁。 一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞。

synchronize的底层实现

在JVM中对象在内存的布局分为三块区域:对象头,实例数据和对齐填充。那synchronized的底层实现,锁就是存在对象头里的,那为什么是对象头呢?hotspot虚拟机的对象头主要包括两部分数据:Mark Word(标记字段),class pointer(类型指针)。其中class point是对象指向它的类元素的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。Mark Word用于存储对象自身运行时的数据,它是实现轻量级锁和偏向锁的关键。

synchronized在JVM里面实现都是基于进入和退出monitor对象来实现方法同步和代码块同步的,具体细节都可以通过对monitorEnter和monitorEixt实现的。 monitorEnter指令:插入在代码块的开始位置,当代码执行带该指令时,将会尝试获取对象monitor的所有权,即尝试获得该对象锁。 monitorExit指令:插入在方法结束和异常出,JVM保证每个monitorEnter都有对应的monitorExit

Synchronized锁升级的顺序

Synchronized在1.6之前是重量级锁,如果第一个线程使用了它,下一个线程想要使用就得等它释放了才能使用。如果发成阻塞了就得一直等待下去,所以效率低下。 1.6之后做了很大的优化,有了锁升级的过程。依次是:无锁状态,偏向锁状态,轻量级锁状态,重量级锁状态。锁是单向执行只能升级,不能降级的。这个过程也是开销逐渐加大的过程。 一开始如果是一个线程的时候是无锁状态,下一次同一个线程进来还是无锁状态,如果有其他线程跟第一个线程进行竞争就会升级为CAS偏向锁,若锁竞争激烈就会升级会轻量级锁,最后升级为重量级锁。 image.png

标签:加锁,Java,synchronized,回顾,对象,代码,升级,线程
From: https://blog.51cto.com/u_15312559/5847973

相关文章

  • Java的五大引用
    目录五大引用概述强引用软引用演示弱引用演示虚引用终结器引用五大引用概述基于可达性算法的垃圾回收实线是强引用,虚线是其他引用强引用只有所有GCRoots对象......
  • java——继承与多态——重点部分总结**********************************************
    Java类名必须是由一个或多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分  成员变量名:成员变量名只要是一个合法的标识符......
  • Java索引
    Java运算符Java基础数据类型Java数组Java数组工具类--ArraysJava比较器--Compare/ComparableJava集合Java函数编程Java泛型编程......
  • pailler算法加密后如何进行密文计算-java
    1.背景工作中需要用到密文计算,涉及密文求和sum、平均avg以及加权平均wavg。特此分享,供参考。2.代码2.1分数类MyFraction涉及小数运算,但是密文目前只能存整数,所以考......
  • 【博学谷学习记录】超强总结,用心分享 。java基础知识。
    Java基础知识1.面向对象的特征封装:就是把对象的属性和行为结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西......
  • Java比较器
    一、Comparable接口类直接实现Comparable接口,并实现compareTo方法packagecn.lxx.test;publicclassUserimplementsComparable<User>{//该类实现Comparable接......
  • Java 使用JavaMail通过Gmail发送电子邮件
    JavaMail提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API可以方便地执行一些常用的邮件传输。可以基于JavaMail开发出类似于MicrosoftOutlook......
  • Java安全之Mojarra JSF反序列化
    Java安全之MojarraJSF反序列化AboutJSFJavaServerFaces,新一代的JavaWeb应用技术标准,吸收了很多JavaServlet以及其他的Web应用框架的特性。JSF为Web应用开发定义了一......
  • 学习Java前的快捷键和软件配置
    目标熟练掌握java每天编写一篇笔记java和python都要学习每天最少要学习4个视频电脑的快捷键ctrl+c复制ctrl+v粘贴ctrl+a全选ctrl+x剪切ctrl+z......
  • java集合
    Java集合分类数据结构一:集合框架的概述1.集合、数组都是对多个数据进行存储的结构简称java容器说明:此时的存储,主要还是内存层面的存储,不涉及持久化存储(数据库、硬......