java同步锁的正确使用
同步锁分类
对象锁(this)
类锁(类的字节码文件对象即类名.class)
字符串锁(比较特别)
应用场景
在多线程下对共享资源的安全操作。
需求:启动5个线程对共享资源total进行安全操作。
同步锁在多线程单例模式下的使用
以上三类同步锁都可以。
package cn.myThread; public class MyThread implements Runnable { |
package cn.test; import cn.myThread.MyThread; public class TestMyThread { |
线程1正在运行 9 线程1线程结束 线程3正在运行 8 线程3线程结束 线程5正在运行 7 线程5线程结束 线程2正在运行 6 线程2线程结束 线程4正在运行 5 线程4线程结束 |
分析:从运行结果可以看出5个线程串行执行同步锁里面的代码,因为5个线程中的同步锁对象this指向同一个的对象(同步锁对象MyThread.class类锁是同一个对象、同步锁对象 ”” 字符串锁是同一个对象),所以5个线程会串行执行同步锁里面的代码。
同步锁在多线程多例模式下的使用
错误用法
package cn.myThread; public class MyThread implements Runnable { |
package cn.test; import cn.myThread.MyThread; public class TestMyThread { |
线程2正在运行 线程1正在运行 线程3正在运行 线程5正在运行 线程4正在运行 9 7 9 8 线程1线程结束 线程5线程结束 线程2线程结束 线程3线程结束 6 线程4线程结束 |
分析:从运行结果可以看出5个线程并行执行同步锁里面的代码,因为5个线程中的同步锁对象this指向5个不同的对象,所以5个线程会同时执行同步锁里面的代码。
正确用法
方式一:
package cn.myThread; public class MyThread implements Runnable { |
package cn.test; import cn.myThread.MyThread; public class TestMyThread { |
线程1正在运行 9 线程1线程结束 线程5正在运行 8 线程5线程结束 线程4正在运行 7 线程4线程结束 线程3正在运行 6 线程3线程结束 线程2正在运行 5 线程2线程结束 |
分析:从运行结果可以看出5个线程串行执行同步锁里面的代码,因为5个线程中的同步锁对象MyThread.class类锁是同一个对象,所以5个线程会串行执行同步锁里面的代码。
方式二:
package cn.myThread; public class MyThread implements Runnable { |
package cn.test; import cn.myThread.MyThread; public class TestMyThread { |
线程1正在运行 9 线程1线程结束 线程4正在运行 8 线程4线程结束 线程5正在运行 7 线程5线程结束 线程3正在运行 6 线程3线程结束 线程2正在运行 5 线程2线程结束 |
分析:从运行结果可以看出5个线程串行执行同步锁里面的代码,因为5个线程中的同步锁对象 ”” 字符串锁是同一个对象,所以5个线程会串行执行同步锁里面的代码。
最新文章
- oracle表分区以及普表转分区表(转)
- myeclipse 无法启动
- 创建catalog数据库
- STM32学习笔记(四) RCC外设的学习和理解
- visual studio 2012 has stopped working
- 走进科学 WAF(Web Appllication Firewall)
- poj 1611 The Suspects 解题报告
- rsync 不能同不子级目录的问题
- Android TextView文字横向自动滚动(跑马灯)
- 设置浮点数的显示精度&;precision(0)
- javascript高级编程笔记01(基本概念)
- Source kit service terminated Editor functionality temporarily limited
- List<;string>; to List<;decimal>; by C# 2.0
- java dom4j解析xml实例(2)
- 最大堆(Java数组实现)
- 快速构建SPA框架SalutJS--项目工程目录 三
- 微信小程序——常用快捷键【四】
- spring-cloud-config-server——Environment Repository(File System Backend)
- 『关键点检测』CPN:Cascaded Pyramid Network for Multi-Person Pose Estimation
- Redis占硬盘空间