Synchronized总结

synchronized 是 Java 中用于实现线程同步的关键字,确保在同一时刻只有一个线程可以执行被 synchronized 修饰的代码块或方法,从而保证并发安全性。其底层实现依赖于 JVM 和操作系统的支持

synchronized 的底层实现依赖于 JVM,通过进入和退出 Monitor 对象来实现方法同步和代码块同步。方法级的同步是隐式的,通过方法表结构中的 ACC_SYNCHRONIZED 标志来实现。当方法调用时,调用指令会检查该标志,如果设置了,执行线程将先持有 monitor,然后再执行方法,最后在方法完成时释放 monitor1

代码块的同步是通过 monitorenter 和 monitorexit 两个字节码指令来实现的。当 JVM 执行到 monitorenter 指令时,当前线程试图获取 monitor 对象的所有权,如果未加锁或者已经被当前线程持有,就把锁的计数器 +1;当执行 monitorexit 指令时,锁计数器 -1,当锁计数器为 0 时,该锁就被释放。

1.synchronized的特性

1.1原子性

synchronized保证了被修饰代码块或者方法的操作是原子的,即保证了其要么全部被执行 要么不执行 不会被其他线程打断

1.2可见性

synchronized确保了线程在解锁前会将共享变量的最新值刷新到主内存中,线程在加锁前就会从主内存中重新读取共享变量的值

1.3有序性

synchronized确保了一个变量在同一时刻只能允许一个线程进行lock操作,从而保证操作的有序性

1.4可重入性

synchronized是可重入锁,允许在一个线程多次请求自己持有的对象锁

2.synchronized的使用

当我们不使用synchronized时 线程的调度是随机的 我们无法保证在某一时刻执行的是哪一个线程

使用synchronized后

2.1synchronized 修饰代码块

我们可以用Object类来创建锁 然后使用锁来实现线程阻塞

我经常在使用时 Object locker=new Object ();

                          synchronized(locker){

                           //加锁内容

                            }

我经常采用上述代码加锁功能

2.2 synchronized 修饰方法

2.3synchronized 修饰类

3.synchronized的锁机制

synchronized 的实现依赖于对象头中的 Monitor。每个对象都有一个与之关联的监视器,用于实现同步。根据锁的状态,synchronized 可以分为无锁、偏向锁、轻量级锁和重量级锁

锁的状态可以从无锁升级为偏向锁、轻量级锁和重量级锁。偏向锁在遇到其他线程竞争时会升级为轻量级锁,轻量级锁在自旋失败后会升级为重量级锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值