首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多线程中锁定对象

在多线程中锁定对象
EN

Stack Overflow用户
提问于 2013-03-15 11:32:34
回答 5查看 141关注 0票数 0

在java中的对象锁定中,我有一个问题。例如。代码:

代码语言:javascript
复制
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如何共享此锁?

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-15 11:36:29

但是另一个线程(例如线程-2)想要进入method2,然后它将进入而不需要等待线程1来释放锁。

不会的。

有一次,只有一个线程可以获取对象的锁。

因此,除非thread-1释放锁,否则thread-2无法执行method2

票数 1
EN

Stack Overflow用户

发布于 2013-03-15 11:36:32

您应该使用特定的锁对象而不是同步方法来使用synchronized块。在这种情况下,也很容易阻塞只需要锁的方法的特定部分,如果不需要同步整个方法,这可能会加快多线程访问速度。

例如:

代码语言:javascript
复制
Object lock = new Object;
public void method1() {
    synchronized(lock) {
      // do stuff here
    }
}
票数 0
EN

Stack Overflow用户

发布于 2013-03-15 11:42:21

在单例类中,只有一个实例可用。因此,当调用同步方法时,它将锁定单个实例。如果存在多个同步方法,则一次只执行一个方法。其他需要等待以前的方法来释放锁。因此,对于这个单例类,基本上只有一个线程。

如果您希望其他方法不会因为其他方法锁而受到影响,请在单例类中使用带有对象锁的同步块。

代码语言:javascript
复制
private final Object object1 = new Object();
private final Object object2 = new Object();

public void method1 {
    synchronized(object1) {
    ....
    }
}

public void method2 {
    synchronized(object2) {
    ....
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15431321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档