b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Java多线程和单例

电脑杂谈  发布时间:2020-04-23 01:16:32  来源:网络整理

多线程调用单例类中的方法会不会造成线程安全问题?_多线程调用单例类中的方法会不会造成线程安全问题?_ios线程安全的单例模式

最近,当公司编写需求时,多线程和单例同时出现.

这时,我考虑了线程安全性和单例的定义. 尽管单例仅指内存中的一个副本,但这并不意味着它是线程安全的.

因此,我去Internet上查找有关多线程单例的线程安全问题的信息多线程调用单例类中的方法会不会造成线程安全问题?,然后我了解了以下博客: 高并发下的单线程模式(最高并发和经典)

多线程调用单例类中的方法会不会造成线程安全问题?_多线程调用单例类中的方法会不会造成线程安全问题?_ios线程安全的单例模式

其中,推荐给博客作者的写作方法如下:

public class MySingleton {  
      
    //使用volatile关键字保其可见性  
    volatile private static MySingleton instance = null;  
      
    private MySingleton(){}  
       
    public static MySingleton getInstance() {  
        try {    
            if(instance != null){//懒汉式   
                  
            }else{  
                //创建实例之前可能会有一些准备性的耗时工作   
                Thread.sleep(300);  
                synchronized (MySingleton.class) {  
                    if(instance == null){//二次检查  
                        instance = new MySingleton();  
                    }  
                }  
            }   
        } catch (InterruptedException e) {   
            e.printStackTrace();  
        }  
        return instance;  
    }  
} 

查看内容多线程调用单例类中的方法会不会造成线程安全问题?,这就是事实,然后使用此代码. 然后在实际测试中,发现它不能保证线程安全.

ios线程安全的单例模式_多线程调用单例类中的方法会不会造成线程安全问题?_多线程调用单例类中的方法会不会造成线程安全问题?

后来,在一位同事的指导下,发现上一段中的线程安全性只是在不实例化单例的前提下以线程安全的方式实例化了单例. 高度并发的多线程环境它仅更新一次.

也就是说,在实例化单例之后,此代码无效.

实例化单例之后,实例! = null始终被建立,因此getInstance()每次都是返回实例. 因此,多个线程可以获取对同一实例的引用.

多线程调用单例类中的方法会不会造成线程安全问题?_多线程调用单例类中的方法会不会造成线程安全问题?_ios线程安全的单例模式

因此,即使使用这种双重检查锁定机制的代码,仍然有必要同步公共方法,以便以后使用以避免问题.

还有两种情况可以同步公共方法. 一种是在public方法中仅存在局部变量,因此此时可能不同步,因为局部变量将仅存在于相应的线程内存中,而不受其他线程的影响. 另一种是包含成员变量. 如果成员变量仅具有读取操作,则它们可以是异步的. 如果成员变量涉及读写操作,则必须同步相应的方法.

局部变量将不受多线程影响

ios线程安全的单例模式_多线程调用单例类中的方法会不会造成线程安全问题?_多线程调用单例类中的方法会不会造成线程安全问题?

成员变量将受到多线程的影响

多个线程应调用同一对象的相同方法:

如果该方法中没有成员变量,则不会受到任何影响

如果该方法中包含成员变量,则仅读取操作不受影响

有一个写操作,请考虑多线程的影响值


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-185396-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...