public class TestDeadLock implements Runnable {//实现接口,是一个线程类。
public int flag = 1;
static Object o1 = new Object(),o2 = new Object();
String s = "synchronized";
public void run(){
synchronized(s)
{
System.out.println("flag = "+flag);
if(flag==1){
synchronized(o1){//锁定o1
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
synchronized(o2){//再锁住o2
System.out.println("1");
}
}
}
if(flag==0){
synchronized(o2){//锁定o2
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
synchronized(o1){//再锁住o1
System.out.println("0");
}
}
}
}
上面的代码synchronized(s){……}把大括号里的代码锁了,为什么synchronized(this){……}不能?
这个synchronized到底是个什么东东??
我在run()方法前加关键字:public synchronized void run(){……}也不能锁住里面的代码?(输出结果是不对的)
是不是run()方法是接口中定义而重写的,这样加了关键字就不会被执行呢???
这个synchronized到底是怎么回事啊??

解决方案 »

  1.   

    用this可以锁,前提是两个Thread加载同一个任务
      

  2.   

    synchronized是正对于实例来说的,this表示当前对象,如果有两个线程同时并发,this和你的程序里的String s都锁不住,应为两个线程同时并发下,每个线程都有自己的this和String s。
      

  3.   

    在上面的代码中两个线程同时并发时用synchronized(s){……}就把大括号中的代码锁住了。
    而用synchronized(this){……}就没有锁住,我执行过了,输出结果是不一样的。用String s就起作用了,而用this确实没有用。
      

  4.   

    用this不能锁?还是看你自己写的执行代码吧。