当前位置: 首页 > 知识库问答 >
问题:

如何同步工作在Java?

李昊苍
2023-03-14

我对Java同步有一个疑问。我想知道如果我的类中有三个同步方法,一个线程在一个同步方法中获取锁,其他两个会被锁定吗?我问这个问题是因为我与以下语句混淆了。

当一个线程在一个对象的同步方法内部时,所有希望执行这个同步方法或该对象的任何其他同步方法的其他线程都必须等待。这个限制不适用于已经有锁并正在执行该对象的同步方法的线程。这样的方法可以调用该对象的其他同步方法而不会被阻塞。该对象的非同步方法当然可以随时被任何线程调用

共有3个答案

李俊雅
2023-03-14

每个java对象(类实例)都有一个互斥对象。方法前面的synchronized关键字表示正在运行的线程必须获得该对象的互斥锁。事实上

public synchronized doSomething(){
   ...
}

和这个完全一样:

public  doSomething(){
   synchronized(this){
      ...
   }
}

所以是的,每个类实例只有一个线程执行同步方法。

请注意,有时这可能是次优的,因为您希望保护修改,但对于并发读取很好,在这种情况下,您可能需要查看 ReadWriteLock 而不是同步关键字。

郗福
2023-03-14

是的。< br >要执行同步方法,线程需要获取对象上的锁,一次只有一个线程可以获取对象上的锁。

杜辉
2023-03-14

java中的同步是通过获取某个特定对象的监视器来完成的。因此,如果您这样做:

class TestClass {
    SomeClass someVariable;

    public void myMethod () {
        synchronized (someVariable) {
            ...
        }
    }

    public void myOtherMethod() {
        synchronized (someVariable) {
            ...
        }
    }
}

那么在< code>someVariable未被修改的情况下,这两个块将随时受到两个不同线程的保护。基本上,据说这两个块与变量< code>someVariable同步。

当你把 sync 放在方法上时,它基本上意味着与 sync(this) 相同,即在执行此方法的对象上进行同步。

那就是:

public synchronized void myMethod() {
    ...
}

表示与相同:

public void myMethod() {
    synchronized (this) {
       ...
    }
}

因此,为了回答您的问题,是的,线程将无法在不同的线程中同时调用这些方法,因为它们都持有对同一监视器的引用,即this对象的监视器。

 类似资料:
  • 问题内容: 我对Java同步有疑问。我想知道我的类中是否有三个同步方法,并且一个线程在一个同步方法中获得了锁,另外两个将被锁定吗?我问这个问题是因为我对以下陈述感到困惑。 当线程处于对象的同步方法内部时,希望执行该同步方法或对象的任何其他同步方法的所有其他线程将必须等待。此限制不适用于已经具有锁并正在执行对象的同步方法的线程。这样的方法可以调用对象的其他同步方法而不会被阻塞。当然,任何线程都可以随

  • 问题内容: 自从我开始用Java编程以来,我一直在想(大约一两年)。在C语言中,我们必须知道不同的方法才能正确避免线程之间的死锁,因此在同步方法之间有更多选择。 那么Java呢?当我们同步时,如何避免将线程置于死锁状态?它在内部如何运作?是否可以避免死锁,因为我们在比C(或C ++)更高的级别上进行了同步?关于Java中的死锁和同步的任何文档吗? 问题答案: 在后台,它使用两个操作码和字节码级别,

  • 问题内容: 首先,这是一个示例: 我没有得到的是堵塞如何发生。main函数启动两个线程,每个线程都开始各自的弓箭操作。 “同步”到底阻止了什么?为同一对象运行的功能相同(就像我最初想的那样)?同一类的所有对象具有相同的功能吗?同一对象的所有同步功能?同一类所有对象的所有同步功能? 问题答案: 在Java中,每个函数都提供了在其上锁定或锁定线程的功能。同步方法时,该方法将其对象实例用作锁。在你的示例

  • 问题内容: 如果我有一个带有静态方法的util类,它将调用Hibernate函数来完成基本的数据访问。我想知道是否使该方法是确保线程安全的正确方法。 我希望这可以防止对同一数据库实例的信息访问。但是,我现在确定当特定类调用以下代码时,是否阻止所有类调用以下代码。 问题答案: 为了更一般地解决这个问题… 请记住,在方法上使用同步实际上只是简写(假设类是SomeClass): 是相同的 和 是相同的

  • volley库如何在Android中同步工作?我想当volley从服务器得到响应的时候,程序的执行停止并等待volley的结果。

  • 问题内容: 我正在看AngularJS教程,该教程描述了如何使用Angular资源连接到Twitter。(视频教程)这是在示例控制器中设置的资源: 本教程显示了使用调用从资源取回数据的几种方法。第一种方法是将回调传递给get函数。在ajax请求返回后,将使用结果调用回调: 我了解这种方法。这对我来说很有意义。资源表示网络上可以获取数据的位置,只需对URL进行ajax调用,获取json,然后使用js