在一次采访中,有人问我,关于多线程,假设在同一个对象上有两个线程(线程1和线程2)。Thread-1在synchronized method1()中,Thread-2能以任何方式在java中同时进入synchronized method2()吗?
我回答“不”。这里,当Thread-1处于synchronizedmethod1()时,它必须持有对象监视器上的锁,并且只有当它退出synchronizedMethod1()后才会释放对象监视器上锁。所以,Thread-2必须等待Thread-1释放对象监视器上的锁,这样它才能进入synchronizedmethod2()。
但还是请告知Thread-2是否有任何方法,通过任何方式在java中同时输入同步方法2()是否有任何hack如果要实现这个东西
下面是我的程序,现在我已经改变了实现,现在请告知,因为以下程序的输出是
inside M1()
t1--->RUNNABLE
inside M2()
t2--->RUNNABLE
下面是我更新的代码
public class Test {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void m1() {
synchronized(lockA) {
try {
System.out.println("inside M1()");
Thread.sleep(100);
}
catch (InterruptedException ie)
{}
}
}
public void m2() {
synchronized(lockB) {
try {
System.out.println("inside M2()");
Thread.sleep(100); }
catch (InterruptedException ie) {}
}
}
public static void main(String[] args) throws InterruptedException {
final Test t = new Test();
Thread t1 = new Thread()
{ html" target="_blank">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("t1--->"+t1.getState());
System.out.println("t2--->"+t2.getState());
}
}
您的代码如下所示:
void method1(){
synchronized(this) {
//...
}
}
synchronized void method2(){
synchronized(this) {
//...
}
}
在您的代码中,两个线程不能同时进入两个方法以进行锁争用。您只能在不同的可运行实例上执行,即不同的this。
两个线程不能同时持有同一个锁。然而,仅仅因为线程在对象的< code>synchronized方法中,并不意味着它持有锁。例如,它可以对条件变量调用< code>await,并在等待时释放锁。这允许其他线程通过输入< code>synchronized方法来获取锁——毕竟,这正是您所期待的。
注意,在您的示例中,即使MyRunnable1类有一个method1(),并且您的run()函数在循环中调用这个方法,线程也不会在任何事情上竞争。因为thread1和thread2是不同的实例,每个实例都有自己的method1()副本,所以synchronized使用的锁是不同的,而不是一个锁。
我写了一个启动两个线程的代码片段;一个线程打印所有奇数,而另一个线程打印所有偶数。我使用了内在锁和线程通信命令的组合来实现两个线程的正确交叉。这是我的代码, 以下是我的问题: > 奇数线程在printOdd()函数中执行,而偶数线程在print偶数()函数中执行。我对两个线程都使用一个内在锁;我不明白两个线程怎么能同时存在于各自的同步块中,因为使用了相同的锁。 我从代码中删除了线程通信语句(通知,
我有以下方法将播放器添加到数据库或更新它,如果它已经存在: 这个方法有时由两个不同的线程调用,因此几乎同时执行两次。有时我会得到以下异常: org . H2 . JDBC . jdbcsqlintegrityconstraintviolationexception:唯一索引或主键冲突:" PUBLIC。PUBLIC上的PRIMARY_KEY_B42。玩家(ID)值3”; 这对我来说是有意义的,因为
我有一个情况,我需要启动两个线程一个接一个。我尝试了以下代码片段,在这里我可以启动Thread12,但不能启动Thread2。我怎样才能开始两个......?如何启动两个线程一个接一个...? 代码片段
如果我没有错的话,Thread-1和thread-3正在进入synchronized方法,因为它有两个不同的目标对象。但是为什么线程2进入同步块呢? 请帮助我理解这一点。提前谢了。
本文向大家介绍Java实现的两个线程同时运行案例,包括了Java实现的两个线程同时运行案例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现的两个线程同时运行。分享给大家供大家参考,具体如下: 运行结果: 更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作
下面是