线程安全问题的解决方案
线程安全问题的解决方案
条件:
- 多线程并发
- 有共享数据
- 共享数据有修改行为
满足这些条件就会存在线程安全问题。怎么解决这个安全问题呢!线程排队执行,又称线程同步机制。
线程同步机制就是线程排队。这样就不能并发了,会牺牲效率。
异步就是并发 同步就是排队
java中每一个对象都有一个对象锁! 执行时,如果有synchronized并且属于这个类,那么执行这个方法时,这把锁就会被标记,当同时有另外一个线程对该对象进行执行该方法的时候,就会等待标记被释放,才能进入方法体!
线程同步机制语法 synchronized三种写法
-
同步代码块 灵活
//synchronized后面小括号中传的这个数据“相当关键”。这个数据必须是多线程共享的数据,才能达到多线程排队 synchronized (*.class){ //需要排队的方法块 }
-
在实例方法上使用 表示锁的是this 并且同步代码块是整个方法体
public synchronized void method(){ //方法快 }
-
在静态方法上使用synchronized 类锁 一个类一个锁 一百个对象也只有一个类锁
public synchronized static void method(){ //方法快 }
开发中怎么解决线程安全问题?
第一步方案:尽量使用局部变量代替“实例变量和静态变量”。
第二种方案:如果必是实力变量,那么可以考虑创建多个对象,这样实例变量的内存就不再共享了。(一个吸纳成对应一个对象,100个线程对应100个对象,对象不共享,就没有数据安全问题了。)
第三种方案:如果不能使用局部变量,对象也不能创建多个,就只能选择synchronized了,线程安全同步机制。
使用synchronized方法的时候,考虑到效率,被synchronied包含的代码块越少越好!
线程安全问题,主要似乎为了解决放在JVM堆区里面的变量
三大变量:
实际变量(堆中),静态变量(方法区),局部变量(栈中)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战