繁体   English   中英

Java多线程非静态和静态方法的行为保持不变

[英]Java Multi threading Non Static and Static method behavior remains same

当我同步非静态方法和静态方法时,行为保持不变。 在两种情况下,当我将synced(Task.class)都放入时,线程会同时为静态和非staitc方法锁定实例

public class ThreadDemo {
    public static void main(String[] args) {

        for(int i=0;i<10;i++){
            Task task =new Task();
            new Thread(task).start();
        }
    }
}
class Task implements Runnable {

    @Override
    public void run() {
        printThreadName();

    }

    public  void printThreadName() {
        synchronized (Task.class) {


        System.out.println("Starting-->"+Thread.currentThread().getName());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Ending->"+Thread.currentThread().getName());
        }
    }

}

在将方法设为静态之后

public  static  void printThreadName() {
        synchronized (Task.class) {


        System.out.println("Starting-->"+Thread.currentThread().getName());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Ending->"+Thread.currentThread().getName());
        }
    }

每个线程都会锁定该类,直到完成为止,依此类推。 我的问题是为什么在第一种情况下,即使对于非静态方法,此行为也是如此。

我将总结以上评论:

JLS声明以下内容:(我强调)

如果该方法是实例方法 ,则它将锁定与其调用实例相关联的监视器(即,在该方法的主体执行期间将被称为此对象的对象)。 如果该方法是static ,则它将锁定与Class对象关联的监视器,该对象代表定义该方法的类。

因此,这将在实例上同步:

public synchronized void someMethod() { ... }

这将在类上同步:

public static synchronized void someMethod() { ... }

当您方法内部使用同步块时,您需要提供监视器,该监视器可以是类(例如Myclass.class )或任何对象实例(可以是this ):

synchronized(monitor) { ... }

您可以使用synchronized(getClass())synchronized(this)来获得与方法级同步非常相似的行为(我不确定getClass()变体在所有情况下的行为是否相同)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM