总结 synchronized

简介: 总结 synchronized

synchronized的特性


1. 互斥


synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行到同一个对象 synchronized 就会阻塞等待.


进入 synchronized 修饰的代码块, 相当于 加锁

退出 synchronized 修饰的代码块, 相当于 解锁


所有对象都可以作为 synchronized的锁(基本数据类型对象除外).


2. 刷新内存


synchronized 的工作过程 :


  1. 获得互斥锁
  2. 从主内存拷贝变量的最新副本到工作的内存
  3. 执行代码
  4. 将更改后的共享变量的值刷新到主内存
  5. 释放互斥锁


synchronized 也能保证内存可见性


3. 可重入


synchronized 对同一条线程来说是可重入的,不会出现自己把自己锁死的问题.

就是在锁里面再加一把锁, 并且两把锁的锁对象都是同一个, 一般来说要想进入第二把锁就得等第一把锁将锁对象释放了, 而第一把锁想释放就得进入并走出第二把锁, 这就产生了矛盾, 产生了死锁. 而 synchronized 并没有这样的问题.


synchronized的使用


synchronized 本质上要修改指定对象的 “对象头”. 从使用角度来看, synchronized 也势必要搭配一个具体的对象来使用.


1. 直接修饰普通方法

public class SynchronizedDemo {
  public synchronized void methond() {
  }
}


2. 修饰静态方法

public class SynchronizedDemo {
  public synchronized static void method() {
  }
}


3. 修饰代码块

锁当前对象


public class SynchronizedDemo {
  public void method() {
  synchronized (this) {
  }
  }
}


锁类对象


public class SynchronizedDemo {
  public void method() {
  synchronized (SynchronizedDemo.class) { //通过反射来获得对象
  }
  }
}


synchronized的锁机制


基本特点


  1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁.
  2. 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁.
  3. 实现轻量级锁的时候大概率用到自旋锁策略.
  4. 是一种不公平锁 (产生阻塞等待时, 不是按顺序来得到锁)
  5. 是一种可重入锁.
  6. 不是读写锁.


关键锁策略 : 锁升级



a84e162f294749faa3bcd28b71c8c621.png


偏向锁不是真的 “加锁”, 只是打上一个 “标记”, 记录这个锁属于哪个线程.

如果后续没有其他线程来竞争该锁, 那么就不用进行其他操作了(避免了加锁解锁的开销)

如果后续其他线程来竞争这把锁了, 偏向锁就升级为自旋锁(轻量级锁), 如果竞争进一步激烈, 自旋不能快速获取到锁状态, 就会变为重量级锁.


相关文章
|
2月前
|
算法 Java 编译器
Synchronized你又知道多少?
Synchronized 是 JVM 实现的一种互斥同步机制,通过 monitorenter 和 monitorexit 指令控制对象锁的获取与释放。锁的本质是对象头的标记,确保同一时间只有一个线程访问资源。Synchronized 支持可重入性,允许方法内部调用其他同步方法而不阻塞。JVM 对锁进行了优化,引入了自旋锁、偏向锁、轻量级锁和重量级锁,以减少系统开销。Synchronized 属于悲观锁,而乐观锁基于 CAS(Compare and Swap)算法实现非阻塞同步,提高并发性能。
64 6
|
6月前
|
Java
synchronized
synchronized
29 2
|
6月前
|
存储 安全 Java
ReentrantLock和Synchronized简单比较
ReentrantLock和Synchronized简单比较
46 0
|
Java
07.synchronized都问啥?
大家好,我是王有志。经过JMM和锁的铺垫,今天我们正式进入synchronized的内容,来看看关于synchronized面试中都会问啥?
62 1
07.synchronized都问啥?
Synchronized
作用:能够保证在同一时刻最多有一个线程执行该段代码,以保证并发的安全性。(当第一个线程去执行该段代码的时候就拿到锁,并独占这把锁,当方法执行结束或者一定条件后它才释放这把锁,在没释放锁之前,所有的线程处于等待状态)
72 0
synchronized的总结
synchronized的总结
synchronized的总结
|
前端开发 Java Spring
方法上加上 synchronized 就可以了么
方法上加上 synchronized 就可以了么
|
存储 缓存 安全
synchronized的简单理解
synchronized的简单理解
97 0
|
Java 编译器
10.关于synchronized的一切,我都写在这里了
大家好,我是王有志。我们已经完成了synchronized的学习,今天我们利用学习到的知识去回答一些关热点问题。
96 0