网站建设的来源,网站建设交接表,lnmp wordpress php7,久久建筑网外墙岩棉保温板施工工艺第2章 线程安全与共享资源竞争
2.1 synchronized同步介绍
synchronized要解决的是共享资源冲突的问题。当共享资源被任务使用时#xff0c;要对资源提前加锁。所有任务都采用抢占模式#xff0c;即某个任务会抢先对共享资源加上第一把锁。如果这是一个排他锁#xff0c;…第2章 线程安全与共享资源竞争
2.1 synchronized同步介绍
synchronized要解决的是共享资源冲突的问题。当共享资源被任务使用时要对资源提前加锁。所有任务都采用抢占模式即某个任务会抢先对共享资源加上第一把锁。如果这是一个排他锁其他任务在资源被解锁前就无法访问了。如果是共享锁当浏览某些数据时其他任务也可以同时浏览但是不允许修改。
Java提供了资源同步的关键字synchronized它的作用是获取指定对象的监视器锁。每个Object对象都内置了一个监视器锁当某个线程获得了这个监视器锁后其他线程再想获得这个对象的监视器锁就必须要排队等待。也就是说synchronized关键字的底层相当于一个排他锁。
2.2.1 类锁与对象锁
synchronized同步成员方法本质使用的是当前对象的监视器锁。而synchronized同步静态方法则使用的是当前Class的监视器锁。
java.lang.Object是所有对象的根在Object的每个实例中都内置了对象监视器锁。
java.lang.Class的父类也是Object在每个类型中也内置了一把锁这与对象无关。
2.2.2 静态同步方法之间互斥
静态同步方法之间是互斥的。
2.2.3 静态同步方法与静态非同步方法
同一个类的静态同步方法与静态非同步方法之间没有干扰。
2.3 synchronized同步代码块
synchronized同步方法就是线程在调用方法前获取对象监视器锁方法执行完毕后就释放对象锁。
方法同步的关键是为了保护共享资源如果synchronized方法中没有使用共享资源就无须使用synchronized同步这个方法。
在同步方法中使用共享资源的只是部分代码。为了提高并发性能一般没必要在整个方法的运行期都持有监视器锁。
使用同步代码块模式可以在方法中真正需要使用共享资源时再获取监视器锁共享资源访问结束马上释放锁这样就节省了对象监视器锁的占用时间可以有效提高并发性
2.3.1 锁当前对象
synchronized (this) {}就是获取当前对象的监视器锁。synchronized同步方法本质就是隐式使用了synchronized (this)。
2.3.2 锁其他对象
监视器锁内置于Object对象底层所有对象的根都源于Object因此所有对象都有监视器锁。
使用其他Object对象的监视器锁比使用自身对象的锁代码更加灵活。
修改Clock类使用Object对象的监视器锁同步效果相同。代码如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DeJ4YqnL-1678263842735)(null)]
2.3.3 锁Class
不仅每个对象内置了监视器锁每个数据类型Class也内置了监视器锁。因此Clock类使用内置于Class中的锁也可以很好地实现同步效果。
修改Clock类使用类监视器锁同步效果相同。代码如下 注意synchronized (Object.class)使用的是类锁不是对象锁。但是轻易不要使用Object.class的类锁因为在整个项目中如果其他业务模块也使用Object.class的类锁这样就会产生并发冲突。合理使用类锁的基本原则尽量使用当前类的监视器锁如Clock类的同步模式可以进一步优化如下
会产生并发冲突。合理使用类锁的基本原则尽量使用当前类的监视器锁如Clock类的同步模式可以进一步优化如下