线程安全问题的解决方案

线程安全问题的解决方案

条件:
  • 多线程并发
  • 有共享数据
  • 共享数据有修改行为

满足这些条件就会存在线程安全问题。怎么解决这个安全问题呢!线程排队执行,又称线程同步机制

线程同步机制就是线程排队。这样就不能并发了,会牺牲效率。

异步就是并发 同步就是排队

java中每一个对象都有一个对象锁! 执行时,如果有synchronized并且属于这个类,那么执行这个方法时,这把锁就会被标记,当同时有另外一个线程对该对象进行执行该方法的时候,就会等待标记被释放,才能进入方法体!

线程同步机制语法 synchronized三种写法

  • 同步代码块 灵活

    //synchronized后面小括号中传的这个数据“相当关键”。这个数据必须是多线程共享的数据,才能达到多线程排队
    synchronized (*.class){
    	//需要排队的方法块
    }
    
  • 在实例方法上使用 表示锁的是this 并且同步代码块是整个方法体

    public synchronized void method(){
    	//方法快
    }
    
  • 在静态方法上使用synchronized 类锁 一个类一个锁 一百个对象也只有一个类锁

    public synchronized static void method(){
        //方法快
    }
    

开发中怎么解决线程安全问题?

第一步方案:尽量使用局部变量代替“实例变量和静态变量”。

第二种方案:如果必是实力变量,那么可以考虑创建多个对象,这样实例变量的内存就不再共享了。(一个吸纳成对应一个对象,100个线程对应100个对象,对象不共享,就没有数据安全问题了。)

第三种方案:如果不能使用局部变量,对象也不能创建多个,就只能选择synchronized了,线程安全同步机制。

使用synchronized方法的时候,考虑到效率,被synchronied包含的代码块越少越好!

线程安全问题,主要似乎为了解决放在JVM堆区里面的变量

三大变量:

实际变量(堆中),静态变量(方法区),局部变量(栈中)

posted @   Tian-Jotian-Yongxing  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示