Java

时间:2019-04-30 08:21:46

标签: java synchronization

假设有四种方法(m1,m2,m3,m4)两个线程(t1,t2),现在我想在下面知道-

1。非静态情况:

a)假设所有方法都已同步但非静态,并说t1正在访问m1,那么t2可以访问m2 / m3 / m4吗?

b)假设 m1和m2是同步的,并且 m3和m4是非同步的都是非静态的,现在说t1正在访问m1,然后t2可以访问m2 / m3 / m4吗?

2。静态案例:

a)假设所有方法都是同步且静态的,并说t1正在访问m1,那么t2可以访问m2 / m3 / m4吗?

b)假设所有方法都是静态的,并且 m1和m2已同步,并且 m3和m4不同步,现在说t1是访问m1,然后t2可以访问m2 / m3 / m4吗?

3。混合大小写:

a) m1&m2-静态和同步 m3&m4-非静态和非同步。现在说t1正在访问m1,那么t2可以访问m2 / m3 / m4吗?

b) m1-静态和同步 m2-静态和非同步 m3-非静态和同步 m4-非静态和非同步。现在说t1正在访问m1,那么t2可以访问m2 / m3 / m4吗?

有人可以在上面回答并解释吗?谢谢!

2 个答案:

答案 0 :(得分:1)

1。
  a)号
  b)仅m3m4
2.
  a)号
  b)仅m3m4
3.
  a)仅m3m4
  b)是的。

答案 1 :(得分:1)

根据JLS

  

同步语句代表执行线程获取互斥锁,执行一个块,然后释放该锁。当执行线程拥有该锁时,其他任何线程都无法获取该锁。

对于同步的非静态方法,将在与调用该方法的实例相关联的监视器上获取锁。

对于同步的 static 方法,该锁是在与定义了被调用方法的类的Class对象关联的监视器上获取的。

请参阅JLS中的Synchronization部分。