gpt4 book ai didi

java - 除了使用 intern 方法之外,有没有办法在 java 中同步 String 变量

转载 作者:行者123 更新时间:2023-11-30 07:01:54 29 4
gpt4 key购买 nike

Intern 方法会继续将字符串添加到池中,这对于长期过程来说是个坏主意。具体情况是这样的:

// rowKey variable defined below is the value of a row key extracted from a 
// table of the db. There can be many rowKey values. (>100000).
String rowKey = "rowId_123123";
/* Once rowKey is extracted, then if another thread extracts the same
row from the table, then it should be put to wait. Object locking will
put all the threads to wait irrespective of the rowKey value which will
hinder performance. Interning the string will put it into the pool till
jvm execution.
*/

有没有一种方法可以在不驻留字符串和仅在字符串上同步的情况下实现这一点。或者是否有办法将字符串转换为对所有线程可见的对象?

最佳答案

使用 Guava Striped

过去我曾成功使用 Guava Striped class对于这种类型的 ObjectLock映射操作。有关 Striped 的详细信息类请看Guava wiki Striped JavaDoc .本质上,使用 Striped<Lock>要索引的实例 Lock值来自 String keys 是一种线程安全的方式来生成 Lock在最大化并发性的同时最小化内存占用的实例。如果您避免使用第 3 方库,您可以改为实现自己的 Map<Object, Lock>包装器(可能混合在 WeakReference 中)以推出您自己的 Striped 的功能较差的版本类(一定要直接比较哈希码,而不是依赖 == 运算符或 equals 方法!)。在任何一种情况下,Striped类(class)是开始学习如何实现锁生成/检索的好地方。


例子

请注意,对于特定用例,例如实现数据库行的原子操作,您可能需要使用 ReadWriteLock而不是简单/基本的 Lock (也可以使用 Semaphore)。另外,请注意我们不需要实习 StringStriped.get() 的对象因为Striped类(class)比较Object 's 用于使用哈希码和 String 的相等性类对字符等效 String 之间的哈希码做出特殊保证总是平等的。这个例子确实使用了一个实习 String (字面的 String 会自动保留)但是 Striped类与动态生成的 String 完美配合这不是实习。

final Striped<Lock> stripedLocks = Striped.lock(10);

final String rowID = "rowLock123";

final Lock rowLock = stripedLocks.get(rowID);

try{
rowLock.lock();//Could also use tryLock or lockInterruptibly methods

//... we are successfully in the fenced/locked code block now
//... put your concurrency sensitive code here

}finally{
rowLock.unlock();
}

更正

不要使用 synchronized在返回LockStriped.get(String) 获得的对象!

我正在添加此明确警告以不使用返回的 Lock对象作为 synchronized block 的监视器,因为有人编辑了我的答案以包含错误使用返回的 Lock 的示例作为监视对象。作为引用,这就是上面示例中的样子:

//DO NOT USE THE RETURNED LOCK LIKE THIS

final Lock rowLock = stripedLocks.get(rowID);

synchronized(rowLock){
//...oh no
}

你不应该使用 synchronizedLock 上因为这违背了使用 Lock 的全部目的! Lock类旨在替代 synchronized 的使用 block 。一起使用它们会牺牲 Lock 的好处同时仍然有 synchronized 的头痛和问题.

关于java - 除了使用 intern 方法之外,有没有办法在 java 中同步 String 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29457146/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com