A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-10 22:52  /  1153 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 2012-9-11 23:09 编辑

1 只有在访问同一个对象的时候,或者单例的时候才会出现线程安全问题。

2 java类中定义静态变量和实例变量都不是线程安全的(如果不加锁的话)

3 静态方法可以被并发访问。

4 java类中定义了一个静态方法,如果该方法没有使用实例变量或者静态变量,
那么他就是线程安全的,如果使用了,就不是线程安全的

以上4点说得都对吗?

public class TestSingletion
{
         private TestSingletion(){}
public static TestSingletion  instance= null;
public static TestSingletion getInstance()
  {
if(instance==null)
{
  instance  = new TestSingletion();
  return instance;
}
else
{
  return instance;
}
   }

}
上面这个类
因为静态方法调用了静态变量,所以单例模式不是线程安全的?对吗?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
单例模式分懒汉式和饿汉式。
饿汉式。
class Single{
        private static final Single s=new Single();
        private Single(){}
        public static Single getInstance(){
                return s;
}
}
懒汉式。
class Single{
        private static Single s=null;
        private Single(){}
public static Single getInstance(){  s为共享数据,如果多个线程并发访问该方法,就会有安全隐患,所以要同步
        if(s==null){
                synchronized(Single.class){  但是每个线程想获取实例都要判断一次锁,效率就比较低
                                                          所以用双重判断解决效率低的问题

                        if(s==null){
                                s=new Single();
}
}
}
}
}
回复 使用道具 举报
我认为看线程安全不安全,首先要看数据有没有被共享,其次再看多个线程之间有没有对共享的数据发生可能的增,删,改,或者是判断之类的操作,即可能导致公共的数据发生变化之类的操作。如果共享的数据没有发生后者的情况,就算是多线程运行,也不可能出现安全问题。
我认为对于单例设计模式中懒汉式模式中为什么出现线程的不安全,是因为里面有对赋值进行判断的语句,如果放在多线程下就会不安全,具体的代码你的你在去看看老师讲解的视频吧,里面说的很清楚。
public class TestSingletion
{
         private TestSingletion(){}
public static TestSingletion  instance= null;
public static TestSingletion getInstance()
  {
if(instance==null)//因为这里对instance进行了判断,如果不进行同步的话就会导致两个线程运行的时候各自得到该类的一个实列。
{
  instance  = new TestSingletion();
  return instance;
}
else
{
  return instance;
}
   }
}
public class TestSingletion
{
        private static TestSingletion instance=new TestSingletion();
        public static TestSingletion getInstance()
        {
                return instance;
        }
}
instance虽然也为静态,但是他没有涉及到被多线程运行改变的可能性,所以会安全。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马