在java中的对象锁定中,我有一个问题。例如。代码:
public class A
{
private static A a = null; // singleton instance
private A()
{
}
public static synchronized A getInst()
{
if (a == null)
{
a = new A();
}
return a;
}
public synchronized void method1()
{
//some action
}
public synchronized void method2()
{
//some action
}
}当线程(例如线程-1)在method1()中工作时,那么线程-1就会获得单例对象的锁。但是另一个线程(例如线程-2)想要进入method2(),然后它将进入,而不等待线程-1释放锁。线程-1和线程-2如何共享此锁?
谢谢
发布于 2013-03-15 11:36:29
但是另一个线程(例如线程-2)想要进入method2,然后它将进入而不需要等待线程1来释放锁。
不会的。
有一次,只有一个线程可以获取对象的锁。
因此,除非thread-1释放锁,否则thread-2无法执行method2。
读这。
发布于 2013-03-15 11:36:32
您应该使用特定的锁对象而不是同步方法来使用synchronized块。在这种情况下,也很容易阻塞只需要锁的方法的特定部分,如果不需要同步整个方法,这可能会加快多线程访问速度。
例如:
Object lock = new Object;
public void method1() {
synchronized(lock) {
// do stuff here
}
}发布于 2013-03-15 11:42:21
在单例类中,只有一个实例可用。因此,当调用同步方法时,它将锁定单个实例。如果存在多个同步方法,则一次只执行一个方法。其他需要等待以前的方法来释放锁。因此,对于这个单例类,基本上只有一个线程。
如果您希望其他方法不会因为其他方法锁而受到影响,请在单例类中使用带有对象锁的同步块。
private final Object object1 = new Object();
private final Object object2 = new Object();
public void method1 {
synchronized(object1) {
....
}
}
public void method2 {
synchronized(object2) {
....
}
}https://stackoverflow.com/questions/15431321
复制相似问题