【Java】回顾一下Java中的synchronized

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

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

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

synchronized的使用

synchronized的三种使用方式:

  • 修饰实例方法:作用于当前实例加锁。

代码里面是在方法前面加上synchronized,就是publich后加上synchronized,代码实例如下:

public synchronized getMethod(){
  // todo 实现方法
}

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

public synchronized static void getMethod() {
   // 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

相关文章
|
1月前
|
存储 安全 Java
Java中synchronized锁的深入理解
Java中synchronized锁的深入理解
21 1
|
1月前
|
安全 Java 测试技术
Java必懂知识点重入锁 synchronized以及应用场景
Java必懂知识点重入锁 synchronized以及应用场景
51 1
|
2月前
|
存储 Java 程序员
记一次synchronized锁字符串引发的坑兼再谈Java字符串
记一次synchronized锁字符串引发的坑兼再谈Java字符串
22 2
|
1月前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
【4月更文挑战第6天】Java中的`synchronized`关键字用于处理多线程并发,确保共享资源的线程安全。它可以修饰方法或代码块,实现互斥访问。当用于方法时,锁定对象实例或类对象;用于代码块时,锁定指定对象。过度使用可能导致性能问题,应注意避免锁持有时间过长、死锁,并考虑使用`java.util.concurrent`包中的高级工具。正确理解和使用`synchronized`是编写线程安全程序的关键。
|
4月前
|
存储 Java 编译器
解密Java中神奇的Synchronized关键字
解密Java中神奇的Synchronized关键字
|
2月前
|
安全 Java
Java并发编程:Synchronized及其实现原理
Java并发编程:Synchronized及其实现原理
25 4
|
5月前
|
安全 Java 程序员
Java 8 中 ReentrantLock 与 Synchronized 的区别
Java 8 中 ReentrantLock 与 Synchronized 的区别
|
1天前
|
安全 算法 Java
Java一分钟:线程同步:synchronized关键字
【5月更文挑战第11天】Java中的`synchronized`关键字用于线程同步,防止竞态条件,确保数据一致性。本文介绍了其工作原理、常见问题及避免策略。同步方法和同步代码块是两种使用形式,需注意避免死锁、过度使用导致的性能影响以及理解锁的可重入性和升级降级机制。示例展示了同步方法和代码块的运用,以及如何避免死锁。正确使用`synchronized`是编写多线程安全代码的核心。
10 2
|
3天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
6 0
|
12天前
|
存储 安全 Java
【亮剑】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制
【4月更文挑战第30天】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制。`ThreadLocal`为每个线程提供独立变量副本;`Volatile`确保变量可见性,但不保证原子性;`Synchronized`实现同步锁,保证单线程执行;`Atomic`类利用CAS实现无锁并发控制。理解其原理有助于编写高效线程安全代码。根据业务场景选择合适机制至关重要。