Java 如果一个程序完全由线程安全类组成,它是线程安全程序吗?
这更像是一个假设性的问题,若一个程序完全由线程安全的类组成,我们能假设它是线程安全的程序吗?在什么情况下,这样的程序可能不是线程安全的程序?这里的一个油嘴滑舌的回答是,没有一个程序完全由线程安全类组成,因为每个程序都包含JDK的类,其中许多不是线程安全的。因此,任何形式为“如果程序完全由线程安全类组成,[…]”的语句都是由 一个更具信息性的答案(尽管仍然有点油嘴滑舌)是,任何程序都是通过调用某个类中的公共静态Java 如果一个程序完全由线程安全类组成,它是线程安全程序吗?,java,multithreading,Java,Multithreading,这更像是一个假设性的问题,若一个程序完全由线程安全的类组成,我们能假设它是线程安全的程序吗?在什么情况下,这样的程序可能不是线程安全的程序?这里的一个油嘴滑舌的回答是,没有一个程序完全由线程安全类组成,因为每个程序都包含JDK的类,其中许多不是线程安全的。因此,任何形式为“如果程序完全由线程安全类组成,[…]”的语句都是由 一个更具信息性的答案(尽管仍然有点油嘴滑舌)是,任何程序都是通过调用某个类中的公共静态main方法来运行的,如果调用该方法时出现线程错误,那么将该类称为“线程安全”可能没有意
main
方法来运行的,如果调用该方法时出现线程错误,那么将该类称为“线程安全”可能没有意义
但是这里更深层次的答案是线程安全实际上是整个程序的一个属性。当我们说一个给定的类是“线程安全的”,或者(更恰当地说)一个给定的类的实例是“线程安全的”时,我们通常的意思是,该类被设计为即使在从多个线程并发使用时也能保持其不变量,而Java中的默认假设是,当多个线程在没有任何外部同步的情况下使用对象时,允许对象完全违反其通常的约定。这在构建线程安全程序时非常有用,但即使一个对象正在维护其记录的不变量,这并不意味着它在一个线程中的行为将完全不受其他线程中对它所做的事情的影响。(例如,ConcurrentHashMap
永远不会被并发操作的多个线程损坏,但是如果有其他线程正在添加或删除元素,则多次调用其size()
方法的线程每次都可以获得不同的值。)因此,即使是“线程安全的”类有时可以以非线程安全的方式使用(取决于类)
此外,当我们说一个类是“线程安全的”时,我们假设您不会破坏它试图提供的保证。如果你这样做了,那么所有的赌注都输光了 这里的一个油嘴滑舌的回答是,没有一个程序完全由线程安全类组成,因为每个程序都包含JDK的类,其中许多不是线程安全的。因此,任何形式为“如果程序完全由线程安全类组成,[…]”的语句都是由 一个更具信息性的答案(尽管仍然有点油嘴滑舌)是,任何程序都是通过调用某个类中的公共静态
main
方法来运行的,如果调用该方法时出现线程错误,那么将该类称为“线程安全”可能没有意义
但是这里更深层次的答案是线程安全实际上是整个程序的一个属性。当我们说一个给定的类是“线程安全的”,或者(更恰当地说)一个给定的类的实例是“线程安全的”时,我们通常的意思是,该类被设计为即使在从多个线程并发使用时也能保持其不变量,而Java中的默认假设是,当多个线程在没有任何外部同步的情况下使用对象时,允许对象完全违反其通常的约定。这在构建线程安全程序时非常有用,但即使一个对象正在维护其记录的不变量,这并不意味着它在一个线程中的行为将完全不受其他线程中对它所做的事情的影响。(例如,ConcurrentHashMap
永远不会被并发操作的多个线程损坏,但是如果有其他线程正在添加或删除元素,则多次调用其size()
方法的线程每次都可以获得不同的值。)因此,即使是“线程安全的”类有时可以以非线程安全的方式使用(取决于类)
此外,当我们说一个类是“线程安全的”时,我们假设您不会破坏它试图提供的保证。如果你这样做了,那么所有的赌注都输光了 这回答了你的问题吗?这回答了你的问题吗?