
最近,当公司编写需求时,多线程和单例同时出现.
这时,我考虑了线程安全性和单例的定义. 尽管单例仅指内存中的一个副本,但这并不意味着它是线程安全的.
因此,我去Internet上查找有关多线程单例的线程安全问题的信息多线程调用单例类中的方法会不会造成线程安全问题?,然后我了解了以下博客: 高并发下的单线程模式(最高并发和经典)

其中,推荐给博客作者的写作方法如下:
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; } }
查看内容多线程调用单例类中的方法会不会造成线程安全问题?,这就是事实,然后使用此代码. 然后在实际测试中,发现它不能保证线程安全.

后来,在一位同事的指导下,发现上一段中的线程安全性只是在不实例化单例的前提下以线程安全的方式实例化了单例. 高度并发的多线程环境它仅更新一次.
也就是说,在实例化单例之后,此代码无效.
实例化单例之后,实例! = null始终被建立,因此getInstance()每次都是返回实例. 因此,多个线程可以获取对同一实例的引用.

因此,即使使用这种双重检查锁定机制的代码,仍然有必要同步公共方法,以便以后使用以避免问题.
还有两种情况可以同步公共方法. 一种是在public方法中仅存在局部变量,因此此时可能不同步,因为局部变量将仅存在于相应的线程内存中,而不受其他线程的影响. 另一种是包含成员变量. 如果成员变量仅具有读取操作,则它们可以是异步的. 如果成员变量涉及读写操作,则必须同步相应的方法.
局部变量将不受多线程影响

成员变量将受到多线程的影响
多个线程应调用同一对象的相同方法:
如果该方法中没有成员变量,则不会受到任何影响
如果该方法中包含成员变量,则仅读取操作不受影响
有一个写操作,请考虑多线程的影响值
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-185396-1.html
请不起灯光师
呵呵