2014-10-16 96 views
2

在我最近的采访中通过解释的情况下,他们问,如果这个过程是线程安全的进程线程是否安全?

有两种同步方法之一是静态的,其他是不固定的,即,非静态方法A和静态方法B.这两种方法访问共享数据。

现在线程A调用非静态方法A并且线程B调用静态方法B.这个线程是否安全并解释y?

回答

5

不,它不是线程安全的。为了线程安全,不同的线程必须使用同一个锁访问共享数据,但这两种方法使用不同的锁。将静态方法同步使用类作为锁,将实例方法上的同步使用该对象作为锁。

如果线程使用不同的锁,那么这两个线程都不会被阻塞,并且两者都可以同时访问或修改数据。即使线程只访问数据,并且都不修改它,锁定将确保内存可见性。没有共享锁,你不能依靠这种可见性。只有数据是不可变的,无限制的并发访问才是安全的,并且已经是safely published

假设共享数据必须是可变的,修复将是两个方法使用相同的锁。你可以随时指定自己的锁,如果你使用同步块(而不是添加同步到方法),所以实例方法可以使用:

public void yourInstanceMethod() { 
    synchronized(WhateverYourClassIs.class) { 
     // code accessing shared data 
    } 
} 
+0

嗨Nathan,谢谢你的回应。你能否详细说明这个解释。 – Anonymous 2014-10-16 14:27:56

+1

@匿名:你能让我知道哪部分不清楚吗?如果您需要添加更多细节,您可以编辑该问题。 – 2014-10-16 14:28:38

+0

我现在很清楚,有没有办法解决这个问题? – Anonymous 2014-10-16 14:31:29