空中网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)
连续运行两次答案不一样,是什么情况呢
|