总结 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


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

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

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


相关文章
|
4月前
|
存储 安全 Java
|
6月前
|
安全 算法 Java
synchronized 同步锁
Java中的synchronized关键字用于实现线程同步,可以修饰方法或代码块。 1. 修饰方法:当一个方法被synchronized修饰时,只有获得该方法的锁的线程才能执行该方法。其他线程需要等待锁的释放才能执行该方法。 2. 修饰代码块:当某个对象被synchronized修饰时,任何线程在执行该对象中被synchronized修饰的代码块时,必须先获得该对象的锁。其他线程需要等待锁的释放才能执行同步代码块。Java中的每个对象都有一个内置锁,当一个对象被synchronized修饰时,它的内置锁就起作用了。只有获得该锁的线程才能访问被synchronized修饰的代码段。使用synch
38 0
|
6月前
ReentrantLock和Synchronized简单比较
ReentrantLock和Synchronized简单比较
20 0
|
7月前
Synchronized
作用:能够保证在同一时刻最多有一个线程执行该段代码,以保证并发的安全性。(当第一个线程去执行该段代码的时候就拿到锁,并独占这把锁,当方法执行结束或者一定条件后它才释放这把锁,在没释放锁之前,所有的线程处于等待状态)
32 0
|
9月前
|
Java
synchronized的总结
synchronized的总结
synchronized的总结
|
9月前
|
程序员
ReentrantLock与synchronized的区别
ReentrantLock与synchronized的区别
|
9月前
|
前端开发 Java Spring
方法上加上 synchronized 就可以了么
方法上加上 synchronized 就可以了么
|
9月前
|
存储 缓存 安全
synchronized的简单理解
synchronized的简单理解
66 0
|
10月前
|
Java 编译器
10.关于synchronized的一切,我都写在这里了
大家好,我是王有志。我们已经完成了synchronized的学习,今天我们利用学习到的知识去回答一些关热点问题。
54 0
|
10月前
|
Java
07.synchronized都问啥?
大家好,我是王有志。经过JMM和锁的铺垫,今天我们正式进入synchronized的内容,来看看关于synchronized面试中都会问啥?
36 1
07.synchronized都问啥?