是否需要在Java中同步只读访问字符串?在Java中,是否只读访问字符串需要同步?
回答
编号字符串是不可变的。如果你所做的只是阅读字符串,你绝对没问题。
编辑添加:是的,如果你有一个可变属性,改变属性的值需要同步。
这并不完全准确,因此对'String'的引用也需要是'final'以使它完全线程安全。 – 2011-05-19 14:42:02
@Jarrod Roberson虽然通常是只读的(假设他指的是只读字符串的引用 - 而不是其他任何意义),但这也是不重要的。虽然由于只读基本上是最终的,所以最好将其明确。 – Voo 2011-05-19 16:54:02
你不能引用索引'final' – 2011-05-19 16:57:14
不是为String
本身,而是为了参考String
,当然。
编辑:
作为最终(或以其他方式同步的)并不能保证所有线程可以看出,未声明的变量的引用。尽管许多线程都可以安全读取同一个对象的值,但您需要以某种方式确保所有线程都读取最新的引用。
你能解释一下吗?一个例子可以帮助很多。谢谢。 – rreyes1979 2011-05-19 14:27:10
每个字符串的访问是只读(字符串是不可变的),因为String
实例的内容不能更改,所以不需要同步。
字符串是不可变的对象,因此它们本身就是线程安全的。请注意,像String.toUpperCase()这样的函数不会更改String对象本身,但会返回一个新的String。
StringBuffer和StringBuilder是可变对象。 StringBuffer是线程安全的,StringBuilder不是。
像String
不可变对象是线程安全的,因为它们的内部状态不会改变,并final
引用那些String
对象是线程安全的。
但,如果你有一个非最终引用不可变对象,它没有完全线程安全的。
考虑:
public final String x = "This reference is thread safe, it can never change";
到x
任何引用线程,因为什么x
指的是永远无法改变和String
对象是不可改变安全。
并考虑:
public String s = "This reference is not thread safe, it can change";
到s
任何引用不线程安全的,因为s
都不可能变成别的东西。那就是:
s = "this is another different immutable String";
可以改变s
指的是什么。如果您的引用永远不会更改,如果它们预计会发生更改,请将它们声明为volatile
,以便JVM知道重新读取引用的内容,而不执行任何可能会错过对s
的更改的缓存optomizations。
public volatile String s = "This reference is expected to change, so tell the JVM";
对线程安全和更多信息final
关键字见The final word on final。
- 1. 我是否需要在Java中同步对不可变类型的访问?
- 2. Monitor.Wait是否需要同步?
- 3. 这是否需要同步?
- 4. 是否需要volatile,以防止同步访问
- 5. 只是需要从一个字符串
- 6. 在构造函数中访问共享静态变量是否需要同步?
- 7. 如果我们正在同步读取,我们是否需要同步写入?
- 8. 表(字符串,字符串)是否需要索引?
- 9. 缓存是否需要同步?
- 10. 这是否需要显式同步?
- 11. 我是否需要同步writeObject()?
- 12. :是否需要任何同步?
- 13. 该方法是否需要同步?
- 14. 是否需要同步.NET SerialPort写入/读取?
- 15. 是否需要在JPA实体的瞬态字段上同步同步?
- 16. 是否需要在C++中使用字符串<iostream>?
- 17. 是否需要为javascript字符串“转义”字符“<" and ">”?
- 18. 需要从属性列表中访问字符串
- 19. 保留在字符串++只需要字符用C
- 20. 访谈问:Java同步
- 21. DBSet是否需要直接访问?
- 22. 只读连接字符串到访问数据库
- 23. 需要修整Java字符串
- 24. 通过ReentrantLock访问字段是否需要volatile关键字?
- 25. Java中是否存在同步队列?
- 26. 我是否需要销毁C++中的字符串
- 27. 只读文件系统访问是否保证写访问?
- 28. Java CDI @ApplicationScoped同步/异步访问
- 29. 企业Java Web App是否需要访问文件系统?
- 30. 是否需要转换字符串的字节顺序?
随意接受更多的答案。 – 2011-05-19 14:23:33
您对于只读访问意味着什么?你可以发布一些代码吗? – Ishtar 2011-05-19 14:30:08