public class SynchronizedTest2 extends Thread
{
 static Synchronized s=new Synchronized();
          public static void main(String[] args){
SynchronizedTest2 st1=new SynchronizedTest2();
SynchronizedTest2 st2=new SynchronizedTest2();
st1.setName("线程A");
st2.setName("线程B");
st1.start();
st2.start();

}
public void run(){
s.method(currentThread().getName());
}
}class Synchronized
{
int num=0;
public synchronized void method(String name){
num++;
try{
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(name+":"+"你是第"+num+"号线程");
}
}
最上面的static Synchronized=new Synchronized();这里的static如果去掉的话,结果就不是预期中的那样了。个人认为有synchronized的method方法,线程访问时按顺序的。可是如果去掉static的话却造成影响了。请问这里的static是什么原因呢?

解决方案 »

  1.   

    不认为你的看法。如果不加static,也就是说Synchronized s=new Synchronized();会执行两次。也就是说每个线程都创建了一个Synchronized 的对象。每个Synchronized 对象那个都会执行自己的内部num属性当第一线程执行时num由0变成1,第二个线程执行num由0变成1;
    加上static 后Synchronized s=new Synchronized();对象只创建一次,它就变成整个类的了。
      

  2.   

    很简单啊:
    SynchronizedTest2 st1=new SynchronizedTest2();
    SynchronizedTest2 st2=new SynchronizedTest2(); 
    如果static Synchronized s=new Synchronized();,那么st1.s==st2.s==SynchronizedTest2.s。也就是说,st1和st2都持有对同一个Synchronized的实例:s的引用。那么锁就会起作用。
    去掉static关键字的话,st1和st2各持有一个Synchronized类的不同实例。而不是持有同一个实例。