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