Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-同步和启动线程_Java_Multithreading_Synchronized - Fatal编程技术网

Java-同步和启动线程

Java-同步和启动线程,java,multithreading,synchronized,Java,Multithreading,Synchronized,我想知道,如果我创建了一个方法synchronized,然后在此方法中启动一个线程,那么其他线程什么时候可以使用该方法 synchronized void someMethod() { //Do stuff. new Thread(new Runnable() { public void run() { //Do more stuff. } }).start(); } 也就是说,当调用somethod的线程退出时

我想知道,如果我创建了一个方法
synchronized
,然后在此方法中启动一个
线程
,那么其他
线程
什么时候可以使用该方法

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

也就是说,当调用
somethod
线程退出时,其他
线程是否能够访问
somethod
,或者当调用somethod的线程退出时,新创建的
线程是否也必须完成,它不会等待新线程完成。

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

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

。这应该是在代码中调用
Thread.start()
之后。这里没有魔法,同步的标准规则适用。

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

   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访问每个线程,同步方法意味着一次只能有一个线程访问任何方法执行。这包括声明和执行一个新实例,以及您的示例中的新线程实例:

   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访问每个线程

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