当前位置: 首页 > 面试题库 >

为什么同步方法允许多个线程同时运行?

南宫云
2023-03-14
问题内容

我在同一文件中有以下程序。我已经同步了run()方法。

class MyThread2 implements Runnable {
    Thread    t;

    MyThread2(String s) {
        t=new Thread(this,s);
        t.start();
    }

    public synchronized  void  run() {
        for (int i=0;i<3;i++) {
            System.out.println("Thread name : "+ Thread.currentThread).getName());
            try {
                t.sleep(1000);
            }
            catch (InterruptedException e) {
                e.getMessage();
            }
        }
    }
}

class TestSync {
    public static void main(String[] args) {
        MyThread2 m1=new MyThread2("My Thread 1");
        c.fun();
    }
}

class c {
    static void fun() {
        MyThread2 m1=new MyThread2("My Thread 4");
    }
}

输出是

Thread name : My Thread 1
Thread name : My Thread 4
Thread name : My Thread 4
Thread name : My Thread 1
Thread name : My Thread 1
Thread name : My Thread 4

我的问题是,为什么同步方法同时允许“我的线程1”和“我的线程4”线程访问?


问题答案:

synchronized
方法在实例级别工作。
类的每个实例都有自己的锁。每次synchronized输入实例的任何方法都将获取该锁。这样可以防止多个线程 在同一个实例上
调用synchronized方法(请注意,这还可以防止在同一个实例上调用 不同的 方法)。 synchronized

现在,由于您有两个类实例,因此每个实例都有自己的锁。没有什么可以阻止两个线程同时在其自己的实例上运行。

如果确实想防止这种情况,则可以在synchronized(obj)里面有一个块run()obj该类在两个类的实例之间共享:

class MyThread2 implements Runnable {
   private static final Object lock = new Object();
   ...
   public void run() {
     synchronized(lock) {
       ...
     }
   }
}


 类似资料:
  • 问题内容: 因此,我的目标是让函数启动自己的线程,以便可以并行运行,而不必等待上一个线程完成。问题在于,它似乎不是多线程的(意味着一个线程在另一个线程开始之前就完成了)。 我也有该函数的内部,但似乎启动的线程的标识与从其运行python脚本的主线程相同。我认为我的方法不正确。 问题答案: 这是常见错误,容易出错。 只需在主线程中一次执行您的函数,然后将(我想为您函数的返回值)作为函数传递给线程,这

  • 问题内容: 我使用的是PHP,而MySQL使用的是PDO。有时我需要准备一个在此查询中多次使用一个变量(占位符)的语句。 例: 但是,如果我尝试准备该语句,则会出现错误,因此我需要采用以下方式: 要调用此语句,我将需要具有以下数组: 对我来说真是太蠢了!为什么MySQL(PDO?)不允许我多次使用一个占位符,并迫使我使用需要更多控制权的额外变量? 如果查询相对简单(如我在上面发布的内容),则可以轻

  • 问题内容: 我已经开始学习线程同步。 同步方法: 同步块: 什么时候应该使用方法和块? 为什么块比方法更好? 问题答案: 这不是更好的问题,只是有所不同。 同步方法时,实际上是在与对象本身进行同步。对于静态方法,您正在同步到对象的类。因此,以下两段代码以相同的方式执行: 就像您写的一样。 如果要控制到特定对象的同步,或者只想将方法的 一部分 同步到该对象,则指定一个块。如果在方法声明上使用关键字,

  • 问题内容: public class Deadlock { static class Friend { private final String name; public Friend(String name) { this.name = name; } public String getName() { return this.name; } public synchronized void b