黑马程序员技术交流社区
标题:
关于单例类中懒汉式的安全问题
[打印本页]
作者:
嘿~~
时间:
2014-8-15 09:09
标题:
关于单例类中懒汉式的安全问题
昨晚看到懒汉式在创建对象时,如果被多个线程同时访问,会存在安全隐患,写出一个小代码,验证一下毕老师的解决方法。
class SingleThread extends Thread
{
public void run(){
//每个线程循环创建Single类的对象
for (int i =0;i<100 ;i++ )
{
Single s = Single.getInstance();
//所有s的哈希值完全一样
System.out.println(Thread.currentThread().getName()+"--->>>"+s.hashCode());
}
}
public int hashCode(){
return this.hashCode();
}
public static void main(String[] args)
{
//开启多个线程验证Single类的getInstance()方法是否存在安全隐患
new SingleThread().start();
new SingleThread().start();
new SingleThread().start();
new SingleThread().start();
}
}
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if (s==null)//此处判断一下,可以提高效率
{
synchronized(Single.class)//此处加锁,只允许一个线程访问创建对象
{
if(s==null)
s = new Single();
}
}
return s;
}
}
复制代码
代码如上。不知可行否,还望高手予以指教!
作者:
嘿~~
时间:
2014-8-15 09:11
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-1--->>>25699763
Thread-1--->>>25699763
Thread-1--->>>25699763
Thread-1--->>>25699763
Thread-1--->>>25699763
Thread-1--->>>25699763
Thread-1--->>>25699763
Thread-1--->>>25699763
Thread-1--->>>25699763
Thread-0--->>>25699763
Thread-1--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
Thread-0--->>>25699763
复制代码
部分输出打印结果,可以看到多个线程创建对象的哈希值完全一样,
作者:
yuli2039
时间:
2014-8-15 18:22
懒汉式单例的代码没啥问题,返回的哈希值都是一样的,说明对象相同。不过你这复写的hashCode方法和没复写不是一样的么?没有加入自己的算法,还是直接返回该对象的hash值
作者:
黑马_java猿
时间:
2014-8-16 08:52
多线程 会有不安全问题 不过有解决方式 老师讲过 但是我忘了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2