为什么字符串类是不可变的?
为什么字符串在 Java 中是不可变的问题是一个古老的问题,并且一直存在争议。在我的书中,我会说它们是不可变的,因为它们应该是不可变的;)。这可能听起来像一个警察,但让我解释一下。
最简单的是,字符串在所有地方都使用,如果它们是可变的,那么在任何地方都需要大量的包袱来制作防御性副本和处理同步等。使它们不可变,然后使用像 StringBuilder/StringBuffer 这样的助手来改变它们是更好的设计选择(并且是多种语言的常见选择,而不仅仅是 Java)。
其次,一切都应该是不可变的,除非有充分的理由证明可变性是合理的。不可变的类(尤其是与并发相关的)很多问题都消失了。请参阅 Effective Java:“类应该是不可变的,除非有充分的理由使它们可变。如果不能使类不可变,请尽可能限制其可变性。”
第三,字符串用于Java的内部,例如类加载机制。使它们不可变使内部流程更简单,并防止一些安全问题。(另一个例子,出于性能原因,字符串常量在 Java 中被“实习”:http ://en.wikipedia.org/wiki/String_interning ,这对于不可变类型来说更加理智。)
总而言之,设计人员选择在 Java 中使字符串不可变可能有几个原因,作为日常程序员,它可以帮助您(就像创建新字符串的实用程序一样,如 StringBuilder)。
为什么等待、通知和通知都应该在同步块内?
这是关于那个的一些信息:wait()、notify() 和 notifyAll() inside synchronized statement。
基本上,线程“通知”或“等待”是没有意义的,除非它已经拥有对象的监视器。
一般来说,如果您是 Java 新手,您可能还想查看 java.util.concurrent 中与并发相关的一些较新的实用程序:http: //docs.oracle.com/javase/6/docs/api /java/util/concurrent/package-summary.html。通常,您可以依赖这些类并避免手动编码同步,这是众所周知的困难且容易出错。