我正在尝试探索静态同步方法
我得到的理论概念是它在类上获取锁,而不是在实例上。但我未能创建一个可以测试它的示例。
这里我创建了要测试的代码,但是两个实例都同时访问静态同步方法
。
class Demo{
public static synchronized void a(){
System.out.println("A Method " + Thread.currentThread().getName());
}
}
public class StaticSyn{
public static void main(String[] args){
Demo obj = new Demo();
Demo obj2 = new Demo();
Thread one = new Thread(){
@Override
public void run(){
int i=0;
while(i<5){
obj.a();
try{
Thread.sleep(100);
}catch(InterruptedException e){
}
i++;
}
}
};
Thread two = new Thread(new Runnable(){
@Override
public void run(){
int i=0;
while(i<5){
obj2.a();
try{
Thread.sleep(100);
}catch(InterruptedException e){ }
i++;
}
}
});
one.start();
two.start();
}
}
使用静态同步
我得到这个输出。
A Method Thread-0
A Method Thread-1
A Method Thread-1
A Method Thread-0
A Method Thread-1
A Method Thread-0
A Method Thread-0
A Method Thread-1
A Method Thread-1
A Method Thread-0
如果没有 static
关键字,我将得到此输出。
A Method Thread-0
A Method Thread-1
A Method Thread-1
A Method Thread-0
A Method Thread-0
A Method Thread-1
A Method Thread-0
A Method Thread-1
A Method Thread-1
A Method Thread-0
那么,问题出在哪里呢?以及如何测试只有一个对象正在访问静态同步方法。
最佳答案
您可以在方法 a()
中添加 sleep
,如下所示:
public static synchronized void a(){
System.out.println("Before sleep: A Method " + Thread.currentThread().getName());
try{
Thread.sleep(100);
} catch(InterruptedException e){
Thread.currentThread().interrupt();
}
System.out.println("After sleep: A Method " + Thread.currentThread().getName());
}
然后您将看到不会像下一个输出那样有 2 个线程同时执行此 block ,实际上您永远不会连续两次 Before sleep
:
Before sleep: A Method Thread-0
After sleep: A Method Thread-0
Before sleep: A Method Thread-1
After sleep: A Method Thread-1
Before sleep: A Method Thread-0
After sleep: A Method Thread-0
Before sleep: A Method Thread-1
After sleep: A Method Thread-1
Before sleep: A Method Thread-0
After sleep: A Method Thread-0
Before sleep: A Method Thread-1
After sleep: A Method Thread-1
Before sleep: A Method Thread-0
After sleep: A Method Thread-0
Before sleep: A Method Thread-1
After sleep: A Method Thread-1
Before sleep: A Method Thread-0
After sleep: A Method Thread-0
Before sleep: A Method Thread-1
After sleep: A Method Thread-1
静态同步
方法和同步
方法有什么区别?
主要区别在于用于同步访问的对象。
静态
例如这样做:
class Demo {
public static synchronized void a() {
// Rest of the method
}
}
相当于:
class Demo {
public static void a() {
synchronized (Demo.class) {
// Rest of the method
}
}
}
换句话说,在静态
方法的情况下,它使用代表类本身的对象来同步访问。
非静态
例如这样做:
class Demo {
public synchronized void a() {
// Rest of the method
}
}
相当于:
class Demo {
public void a() {
synchronized (this) {
// Rest of the method
}
}
}
换句话说,在非静态
方法的情况下,它使用类的当前实例来同步访问。
关于java - Java 中静态同步方法到底是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37051595/