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

是否使用同步可靠?

韩善
2023-03-14

我搜索了很多,但对“ReentrantLock”和正常的“synchronized”的过程感到困惑。

例如(1):

Object obj = new Object();

synchronized(obj){
//lock is guaranteed to be acquired 
}

示例(2)

Lock lock = new ReentrantLock();
lock.lock(); //problem here
try{
//dostuff
}
finally{
lock.unlock();
}

我的问题是:

在示例1中:保证使用synchronized关键字获取对象的锁。

但是

例2:是否保证使用锁获取锁。lock()方法??或者线程会继续执行下一行吗??没有锁。

我对此表示怀疑,因为使用线程多次给我带来了意想不到的结果。

共有1个答案

水渊
2023-03-14

只有一个线程将获得锁:这是ReentrantLock的契约。

因此,您的示例2是完全线程安全的。

 类似资料:
  • 问题内容: 我已经编写了一个JavaScript函数,该函数使用XmlHttpRequest异步调用Web服务。我被要求使此功能在呈现页面之前完成其工作。 我以为我可以使AJAX请求同步,但是我不希望这使页面挂起太长-如果没有收到响应,我想在1秒后中止请求。 是否可以中止同步的XmlHttpRequest? 问题答案: 您不能: http://www.hunlock.com/blogs/Snipp

  • 问题内容: 有谁能举例说明同步方法优于同步块的优势吗? 问题答案: 在块上使用同步方法没有明显的优势。 也许唯一的一个(但我不会称其为优势)是你不需要包括对象引用。 方法: 块: 看到?完全没有优势。 但是,块确实比方法具有优势,主要是在灵活性方面,因为你可以将另一个对象用作锁,而同步该方法将锁定整个对象。 比较: 与 同样,如果方法变大,你仍然可以将同步部分分开:

  • 我最近开始做一个POC来集成java Web应用程序和Dropbox。我发现尽管有一个用于Java的dropbox-core-sdk。但是由于某些原因,dropbox没有为java提供同步库(同步库仅适用于Android/iOS)。 1)我们可以在java Web应用程序中使用android同步api吗?

  • 问题内容: 如果我将某些内容推送到Redis的列表中,然后从该列表中弹出,是否可以保证我会得到较早推送的项目,还是可以在写入之前进行读取? 问题答案: Redis在单个线程中运行(执行后台保存时进行分叉除外,但这无关紧要),因此以后发送的任何请求都必然会在以后运行。这样,您将看到您推送的值。 (不过,再三考虑一下,如果您不愿意并且有意使它故意失败,可能会引发失败。但这将需要通过单独的连接发送请求,

  • 我们知道,有一个最大可重入限制:;块也有可重入限制吗? 更新:我发现很难为同步可重入编写测试代码: 有人能帮我写一些同步可重入极限测试的代码吗?

  • 假设我有以下内容: 然后我这样称呼它: 我省略了并且没有将声明为这一事实是否使它实际上是异步的? 我希望发生的情况是循环会立即完成,因为即使花费了很长时间,也不会被等待,并且会立即返回。 我认为这会导致文件内容在这样调用时被覆盖的问题,但这使我认为代码是以某种方式自动转换为同步代码的(尽管似乎不可能知道何时完成)。 那么,简单地说,从非异步方法调用函数是否会自动使代码同步执行,以及省略和(如在函数