JAVA里面的反模式singleton双重检查成例,在新版本中还是不能成立吗?我问问

zapdos 2015-05-26 11:48:59
因为这个问题由来已久

可以参考这个http://batidb.bokee.com/2107020.html,http://bbs.csdn.net/topics/40145687

如果这都有问题,我怀疑很多多线程同步的情况下是不是同样存在问题啊?

有没有大神解答一下呀?谢谢

...全文
127 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zapdos 2015-05-26
  • 打赏
  • 举报
回复
引用 1 楼 rumlee 的回复:
跟你说的不是一回事,算了,估计在CSDN也问不出什么结果
rumlee 2015-05-26
  • 打赏
  • 举报
回复
例如很简单的一个实例

public class Test41 extends Thread {
	private boolean stop;

	public boolean isStop() {
		return stop;
	}

	public void setStop(boolean stop) {
		this.stop = stop;
	}

	public void run(){
		while(!stop){
			//to do something
			System.out.println("run");
		}
	}
}
对stop属性的赋值以及检测都没有进行同步控制,也没有将stop声明为volatile类型,肯定是存在问题的。但是即使出问题的效果会是怎么样呢,就是程序可能会多循环几次,这种问题对程序结果来说基本上没有影响,或者我们一般并不太关注这种影响。
rumlee 2015-05-26
  • 打赏
  • 举报
回复
双重检查的问题与java的内存模型有关。可能会导致其他线程获取到一个没有初始化好的实例。将引用声明为volatile可以解决这个问题。 但是出现这种错误的概率应该是非常低的,而且在很多情况下,即使出现这种问题并不会导致严重后果或者与最终结果无关,所以并不是特别的关注。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧