java两个线程可以在同一时间点运行两种不同的方法吗?
class A {
private synchronized f() {
...
...
}
private void g() {
...
...
}
}
如果线程T1正在运行已同步的f(),那么线程t2是否可以在T1仍在运行f()的同时运行未同步的g()
你可以在下面搜索框中键入要查询的问题!
class A {
private synchronized f() {
...
...
}
private void g() {
...
...
}
}
如果线程T1正在运行已同步的f(),那么线程t2是否可以在T1仍在运行f()的同时运行未同步的g()
# 1 楼答案
不在A的同一个实例上。实例本身就是锁,所以两个线程同时执行这两个方法,你需要A的两个实例
# 2 楼答案
不。一个呼叫将被阻止,直到另一个呼叫完成。原因是方法上的synchronized关键字会扩展为在对象的当前实例上同步。更具体地,考虑这个代码:
上述代码在功能上与以下代码相同:
因此,如果希望一个对象中的两个方法只相互同步,那么应该创建两个锁对象。每个方法都应该将其所有代码封装在一个同步(对象)块中,每个方法对应一个对象
# 3 楼答案
是的,如果T1和T2分别在A的不同实例上执行
f
和g
如果两个线程都在同一个实例上执行一个方法,那么一次只能有一个线程执行一个方法。如果T1首先运行,它将获取A实例上的锁,并执行方法,而T1在T2完成之前无法运行^{)
f
。线程T2将无法执行方法g
,直到T1完成执行f
。或者相反的情况可能发生:T2可以先运行^{# 4 楼答案
正确的答案是重组者的答案
运行这个,你会看到的。您还可以使用线程进行测试。sleep()而不是无限循环,方法是取消对示例相应部分的注释/注释
如果代码没有遵循最佳实践,我深表歉意,我的java已经生锈了
# 5 楼答案
对。这两种方法可以在同一实例上同时执行
只有
f()
是同步的。线程必须获取this.f()
的监视器才能执行f()
,并且每个实例只存在一个监视器g()
不同步,运行该方法不需要监视器锁定,因此任何线程都可以随时执行g()
“同步方法在执行之前获取监视器(§17.1)。”
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.3.6
# 6 楼答案
通常,两个线程可以在同一时间点运行两个方法;然而,在您的示例中,在任何给定时刻,只有一个线程可能正在运行
f()
或g()
使用
synchronized
关键字可以更改线程交互。每个java对象都有一个锁,一个在任何给定时间只有一个线程可以持有的项Synchronized
是一个命令,它指示线程在执行方法之前获取锁,然后释放它。锁在方法的整个执行过程中保持在您的示例中,在任何给定时间,只有一个线程将执行
f()
或g()
,因为“另一个”线程将等待轮到它来获取锁如果有两个同一类的对象,则有两个锁。这意味着您可以让两个线程同时运行
f()
和g()
,同时保持synchronized
关键字不变,因为线程将在不同的对象上获取锁。如果不删除synchronized
关键字,就无法让线程在同一个对象上同时执行