当前位置: 首页 > 面试题库 >

同步在Java中如何工作?

牟正真
2023-03-14
问题内容

我对Java同步有疑问。我想知道我的类中是否有三个同步方法,并且一个线程在一个同步方法中获得了锁,另外两个将被锁定吗?我问这个问题是因为我对以下陈述感到困惑。

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


问题答案:

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

class TestClass {
    SomeClass someVariable;

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

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

然后,这两个块将通过someVariable不更改而随时执行两个不同的线程来保护。基本上说这两个块是与变量同步的someVariable

当您synchronized使用该方法时,它的基本含义与相同synchronized (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