java - 如何使用 objectId 或 hashcode 对对象进行同步?

标签 java multithreading synchronization

有人可以解释一下同步如何获取对象的锁吗?

我有一个代码,我想在其中动态获取字符串值的锁定。

例如

String a = "abc";
synchronization(a){
   //some logic
}

现在我想要的是,如果我从一个请求接收到 abc 的值,而在另一个请求上我在获取上一个请求的锁定时接收到 abc 的值,则新请求应该等待值。

有人可以帮助一下它是如何工作的/我怎样才能实现这个目标?

最佳答案

Now what I want is if from an api I receive value of a abc from one request and on the other request I receive value of a as abc while obtaining lock on the previous request, the new request should wait on the basis of value.

要为此使用synchronized,您需要确保“abc”对象是相同的字符串对象,而不仅仅是等效字符串(出于同样的原因 you don't compare strings with == ),通过使用 intern

synchronized (a.intern()) {
    // ...
}

synchronized 需要相同的对象,而不仅仅是等效的对象。

<小时/> 也就是说,同步字符串对象以防止应用程序的两个部分同时处理等效请求似乎(从外部看,没有详细信息)有点奇怪,尤其是因为它不会扩展到单个 JVM 实例之外.

关于java - 如何使用 objectId 或 hashcode 对对象进行同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55934780/

相关文章:

c - C语言的线程同步

javascript - Node js FS accessSync设置全局变量路径失败

java - 使用jdbc属性文件在applicatioinContext.xml中设置dataSource。为什么我必须使用${jdbc.XXX}而不是${XXX}?

java - 当我将该字符串转换回 byte[] 时,两者并不相同。谁能帮我?

c# - 线程本地存储和本地方法变量

C 线程无效读取大小为 8 的缓冲区数组

node.js - 将 babel 与 Node 集群结合使用

c++ - 在 windows 中使用互斥量进行进程间同步(win32 或 C++)

java - 如何拒绝访问嵌入式 tomcat 容器中的某些路由

java - 如何在路由器表达式中使用 util 常量?