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

孙鹏启

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 孙鹏启 初级黑马   /  2014-8-5 16:58  /  962 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

空中网5k的线程题第三题,我看视频《22_传智播客_张孝祥_空中网挑选实习生的面试题3》,怎么感觉不对,
代码如下:
import java.util.concurrent.*;
import java.util.*;
class Test3 extends Thread{
        private TestDo testDo;
        private String key;
        private String value;
       
        public Test3(String key,String key2,String value){
                this.testDo = TestDo.getInstance();
                /*常量"1"和"1"是同一个对象,下面这行代码就是要用"1"+""的方式产生新的对象,
                以实现内容没有改变,仍然相等(都还为"1"),但对象却不再是同一个的效果*/
                this.key = key+key2;
                this.value = value;
        }
        public static void main(String[] args) throws InterruptedException{
                Test3 a = new Test3("1","","1");
                Test3 b = new Test3("1","","2");
                Test3 c = new Test3("3","","3");
                Test3 d = new Test3("4","","4");

                System.out.println("begin:"+(System.currentTimeMillis()/1000));
                a.start();
                b.start();
                c.start();
                d.start();

        }
        final Semaphore semaphore = new Semaphore(1);
        public void run(){
                testDo.doSome(key, value);
        }
}
class TestDo {
        private TestDo() {}
        private static TestDo _instance = new TestDo();       
        public static TestDo getInstance() {
                return _instance;
        }

        private CopyOnWriteArrayList<Object> keys = new CopyOnWriteArrayList<Object>();
        public void doSome(Object key, String value) {
                Object o = key;
                if(!keys.contains(o))
                {
                        System.out.println(o);
                        keys.add(o);
                }
                else
                {
                        for(Iterator<Object> it = keys.iterator();it.hasNext();)
                        {
                                Object oo = it.next();
                                if(oo.equals(o))
                                {
                                        o = oo;
                                }
                        }
                }
                synchronized(o)
                // 以大括号内的是需要局部同步的代码,不能改动!
                {
                        try {
                                Thread.sleep(1000);
                                System.out.println(key+":"+value + ":"
                                                + (System.currentTimeMillis() / 1000));
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        }
}

运行 结果图

捕获.PNG (101.69 KB, 下载次数: 3)

连续运行两次答案不一样,是什么情况呢

连续运行两次答案不一样,是什么情况呢
您需要登录后才可以回帖 登录 | 加入黑马