【问题标题】:Java - Synchronizing and Starting Threads [duplicate]Java - 同步和启动线程
【发布时间】:2018-07-13 21:17:00
【问题描述】:

我想知道,如果我创建一个方法synchronized,然后在这个方法中启动一个Thread,其他Threads 什么时候可以使用该方法?

synchronized void someMethod() {
    //Do stuff.
    new Thread(new Runnable() {
        public  void run() {
            //Do more stuff.
        }
    }).start();
}

也就是说,当Thread调用someMethod退出时,其他Threads是否能够访问someMethod,或者新创建的Thread也必须完成?

【问题讨论】:

  • 新创建的线程没有任何不同/特殊的访问权限。唯一的区别是新线程必须在线程启动之前看到您在同步块中所做的任何更改,即使不能保证任何其他线程。

标签: java multithreading synchronized


【解决方案1】:

当调用 someMethod 的线程退出时,它不会等待新线程完成。

【讨论】:

    【解决方案2】:

    每当someMethod() 所属的对象实例上的监视器被释放时。这应该在您的代码中调用 Thread.start() 之后。这里没有魔法,synchronized 的标准规则适用。

    【讨论】:

      【解决方案3】:

      同步方法意味着只有一个线程能够同时访问任何方法执行。这包括声明和执行一个新实例,以及您的示例中的新线程实例:

         new Thread(new Runnable() {
              public  void run() {
                  //Do more stuff.
              }
          }).start();
      

      接下来要触发的线程将声明一个新的不同实例,并且由于您没有将之前声明的线程存储在任何地方,因此无法访问它。

      可以通过一些修改来访问它:

      synchronized void someMethod(int id, HashMap threadsMap) {
          //Do stuff.
          threadsMap.set(id, new Thread(new Runnable() {
              public  void run() {
                  //Do more stuff.
              }
          }));
      threadsMap.get(id).start();
      }
      

      这将允许您通过其 id 访问每个线程

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多