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是什么原因呢?
{
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是什么原因呢?
加上static 后Synchronized s=new Synchronized();对象只创建一次,它就变成整个类的了。
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类的不同实例。而不是持有同一个实例。