Java:在String对象上同步

wuyi

我写一些这样的代码:

public static void function7() {
    String str = "123";
    String str2 = "123";
    synchronized (str) {
        if(str != null) {
            str2 = "123";
        }else{
            str = "456";
        }
        System.out.println(str2);
    }
}

代码编译良好。但是Eclipse的一个插件,查找错误,给出以下错误报告:

常量字符串在JVM加载的所有其他类中进行实习和共享。因此,这可能会锁定其他代码也可能锁定的内容。这可能会导致非常奇怪且难以诊断的阻塞和死锁行为。

到底是什么意思?

史蒂夫·沙洛纳

字符串文字是不可变的,并通过VM的字符串池共享。这意味着,例如,每次编写时,不会在堆上放置"foo"新的String表示foo结果,该字符串池对所有线程可见。然后,在String文字上进行同步会使您暴露于非结构化同步,这是死锁地狱火车的第一站。

高效共享字符串是为什么不应该将带签名的String构造函数与String(String)一起使用的原因,除非您确实有这样做的充分理由。

另外,在本地变量上同步也没有意义,因为在方法之外没有可见性,更不用说在其他线程中了。

最后,您真的需要同步吗?由于您在上面的代码中没有有效地使用它,即使排除了字符串问题,也有可能不必使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在多个对象上同步

来自分类Dev

类对象上的同步

来自分类Dev

在Java中同步对象

来自分类Dev

跨对象的Java同步

来自分类Dev

跨对象的Java同步

来自分类Dev

Java中的对象同步

来自分类Dev

在HashMap值对象上同步

来自分类Dev

Java方法上的同步

来自分类Dev

Java同步和对象锁定

来自分类Dev

Java用不同的方法同步同一对象上的块

来自分类Dev

对象上的Java同步。为什么没有这种僵局?

来自分类Dev

Java用不同的方法同步同一对象上的块

来自分类Dev

为什么要在小对象上同步?

来自分类Dev

为什么要在小对象上同步?

来自分类Dev

不同的线程在不同的对象上同步

来自分类Dev

在此对象和其他对象上同步

来自分类Dev

Java中方法,对象,类的同步

来自分类Dev

具有多个对象/锁的Java同步

来自分类Dev

Java中的同步(对象和静态方法)

来自分类Dev

Java中对象的非同步方法?

来自分类Dev

Java同步方法未锁定对象

来自分类Dev

在java中同步对象是如何工作的

来自分类Dev

在多个线程上同步Java中的队列

来自分类Dev

java-字节上的同步块[]

来自分类Dev

Java同步缓存上的批量操作

来自分类Dev

Java Deadlock在本地资源上同步?

来自分类Dev

Java多线程。在Thread类上同步(this)

来自分类Dev

应该在列表本身还是在锁对象上同步?

来自分类Dev

例如,内部对象上的“已同步”。gameloop.player1