如果静态同步方法在类上锁定而不是它的含义。 这是否意味着除非已经释放类锁,否则无法创建新对象。我尝试了一个程序来解释这个,但我发现它并不意味着这比锁定类意味着什么意味着它意味着该类的所有实例都将被锁定。
public class StsticSyncTest implements Runnable{
public static void main(String[] args) {
Thread t = new Thread(new StsticSyncTest());
t.start();
try {
Y y = new Y();
System.out.println(y);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
@Override
public void run() {
Y y = new Y();
y.method1();
}
}
class Y{
static synchronized void method1(){
for(;;){
//System.out.println("1");
}
}
}
它给出了输出: com.nikhil.test.synchronization.Y@cac268
答案 0 :(得分:3)
synchronized方法使用实例作为锁定对象。
静态同步方法使用类作为锁定对象。
在这两种情况下,同步方法都会阻止对同类(实例或静态)同步方法的其他调用由不同的线程同时进行。
非同步代码不会受到影响。
答案 1 :(得分:2)
这意味着method1
方法或该类中声明为static synchronized
的任何其他方法,或使用synchronized (StsticSyncTest.class)
同步的任何代码块,将是互斥的:赢得两个主题无法同时输入其中两个方法/代码块。
简而言之,它的行为与任何其他同步块完全相同,但此处用作锁定的对象是由类加载器创建的唯一实例Class<StsticSyncTest>
:StsticSyncTest.class。
答案 2 :(得分:0)
同步意味着只有一个线程可以同时运行此方法。尝试运行此方法的所有其他线程将阻塞,直到第一个完成(在您的情况下,将永远不会发生,因为您在那里有无限循环)。它与对象创建无关。