我有4种方法(m1
,m2
,m3
和m4
一类)。方法m1
,m2
并m3
有synchronized
方法。另外,我有4个线程t1
,t2
,t3
和t4
分别。
如果t1
访问m1
方法(同步方法),t2
线程访问m2
方法(同步方法)是否可以同时进行?如果不是,则t2的状态如何?
如果t1访问m1方法(同步方法),t2线程可以同时访问m2方法(同步方法)吗?
该synchronized
关键字适用于 目标水平 ,且只有一个线程可持有对象的锁。因此,只要您在谈论同一个对象,那么 否
,t2
它将等待t1
释放进入时获得的锁m1
。
但是,线程可以通过调用来释放锁而无需从方法中返回Object.wait()
。
如果不是,则t2的状态是什么?
它会紧紧地等待t1
释放锁(从方法返回或调用Object.wait()
)。具体来说,它将处于BLOCKED
状态。
线程的线程状态被阻塞,等待监视器锁定。
处于阻塞状态的线程正在等待监视器锁定以输入同步块/方法,或者在调用后重新输入同步块/方法Object.wait
。
样例代码:
public class Test {
public synchronized void m1() {
try { Thread.sleep(2000); }
catch (InterruptedException ie) {}
}
public synchronized void m2() {
try { Thread.sleep(2000); }
catch (InterruptedException ie) {}
}
public static void main(String[] args) throws InterruptedException {
final Test t = new Test();
Thread t1 = new Thread() { public void run() { t.m1(); } };
Thread t2 = new Thread() { public void run() { t.m2(); } };
t1.start();
Thread.sleep(500);
t2.start();
Thread.sleep(500);
System.out.println(t2.getState());
}
}
输出:
BLOCKED
下面是
一旦遇到这样的问题,这里还有更多内容,然后发现了 一个适当恶劣的解决方法。 这篇文章没有列在索引中,但是为满足你的好奇心而保留了下来。
问题内容: 如果一个同步方法调用另一个同步方法,那么线程安全吗? 问题答案: 是的,将方法标记为时,您实际上是在这样做: 当线程调用从method1进入method2时,它将确保它持有对的锁定,该锁定已经存在,然后可以通过。 当线程直接进入method1或method2时,它将阻塞直到获得锁(),然后进入。 正如詹姆斯·布莱克(James Black)在评论中指出的那样,您必须了解方法主体内部的操
问题内容: 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
问题内容: 我面临有关Java方法同步的问题。希望我能简要解释一下: 我在两个不同的类中,在两个不同的包中有两个不同的方法。就像是: 好的,所以现在我需要同步这两个 不是thread的方法 。到目前为止,我有两种不同的方法: 共享信号量 。 在和外部创建一个共享的静态信号量,例如: 无论如何,我真的不知道JVM是否会将其视为共享信号量。 已同步(SharedClass.class) 。 使用共享类
问题内容: 我在理解同步关键字功能时遇到了一些麻烦。根据Java文档和其他教程,可以说,当使用synced关键字时,在两个线程之间不可能在该方法的语句之间进行交织。 但是,请参见下面的代码。 据我了解,程序输出应始终以线程0和线程1不应交错的方式进行。但是多次执行这段代码后,我得到了交错输出。 请帮助我理解问题。 提前致谢.. 问题答案: 的关键字防止两个线程运行的是在同一对象上同步代码。 您的每