昨晚看到懒汉式在创建对象时,如果被多个线程同时访问,会存在安全隐患,写出一个小代码,验证一下毕老师的解决方法。
- 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;
- }
- }
复制代码
代码如上。不知可行否,还望高手予以指教! |
|