Tag: 不变性

仅使用不可变数据类型是否使Java程序线程安全?

如果我只使用不可变数据类型,我的Java程序是否可以线程安全? 任何其他因素都会影响线程安全吗? ****如果可以提供一个例子,将不胜感激。 谢谢!** **

Java中的不变性和同步性

自从我阅读了Java Concurrency in Practice一书后,我想知道如何使用不变性来简化线程之间的同步问题。 我完全理解不可变对象是线程安全的 。 初始化后它的状态不能改变,因此根本不可能存在“共享可变状态”。 但必须正确使用不可变对象才能在同步问题中被认为有用。 以这段代码为例,它描述了一家银行,它拥有许多账户,并且公开了一种方法,通过这种方法我们可以在账户之间转账。 public class Bank { public static final int NUMBER_OF_ACCOUNT = 100; private double[] accounts = new double[NUMBER_OF_ACCOUNT]; private Lock lock; private Condition sufficientFunds; public Bank(double total) { double singleAmount = total / 100D; for (int i = 0; i accounts[from]) { sufficientFunds.await(); } // Transferring funds […]

对字符串不变性的困惑

我有以下代码: – public class StaticImplementer { private static String str= “ABC”; public static void main(String args[]) { str = str + “XYZ”; } } 问题: – 这里String str是静态的,那么这个对象将存储在内存中? 由于String是不可变的,“XYZ”的对象将被存储在哪里? 最终对象将在哪里存储? 垃圾收集将如何完成?

同步以确保另一个线程将看到对不可变对象的引用

我正在研究这个,以了解新JMM中最终字段的行为(5以后)。 这个概念很清楚:在正确构造对象之后,保证初始化的最终字段对所有线程的可见性。 但是在本节的最后,我读到了这个,这让我感到困惑: 现在,说完所有这些,如果在一个线程构造一个不可变对象(即一个只包含最终字段的对象)之后,你想确保所有其他线程都能正确看到它,你通常还需要使用同步。 例如,没有其他方法可以确保第二个线程可以看到对不可变对象的引用。 这是否意味着虽然单个最终字段(组成不可变对象)没有同步(例如,此处可见性)问题。 但是,在线程中首次创建的不可变对象本身在其他线程中可能不可见(正确创建)? 如果是这样,虽然我们可以跨线程共享初始化的不可变对象而没有任何线程不安全的担忧,但在创建时,他们需要“特别关注”线程安全,就像其他可变项一样?

不可变类的实际例子

显而易见,不变性增加了可重用性,因为它在每个状态变化中创建了新对象。有人告诉我一个我们需要不可变类的实际场景吗?

不可变的子类

我目前正在开发一个multithreading框架。 为了避免副作用,我想要求framewok操纵的所有数据必须是不可变的。 那么Java中是否存在一种方式来指定我希望给定类的所有子类或实现给定接口的所有类都是不可变的?

当实例变量作为arraylist存在时类的不变性

我有一个不可变的类 假设我有一个类型为ArrayList的成员变量的getter方法。 在那种情况下,当我获得对该变量的引用时,我可以添加或删除它中的元素。 在那种情况下,不变性似乎被侵犯了。 任何人都可以详细解释这个概念吗?

是否真的缓存了java.lang.String的哈希码?

String s1 = “String1”; System.out.println(s1.hashCode()); // return an integer i1 Field field = String.class.getDeclaredField(“value”); field.setAccessible(true); char[] value = (char[])field.get(s1); value[0] = ‘J’; value[1] = ‘a’; value[2] = ‘v’; value[3] = ‘a’; value[4] = ‘1’; System.out.println(s1.hashCode()); // return same value of integer i1 即使我在reflection的帮助下更改了字符,也会保留相同的哈希码值。 这里有什么我需要知道的吗?

你期望不可变列表的不变性有多深?

如果你有一个不可变列表,那么你希望它总是在你要求的时候返回对同一个对象的引用 list.get(0) 我的问题是,您是否希望能够改变对象并在下次从列表中获取突变时反映出变异?

java中的不可变类

遵循所有java标准,我使我的类不可变 A. Defined class as final B. declared all fields as private and final C. No setter method D. No method changes the state of object E. declared all method as final F. Safer/defencieve copying of collection/ non mutable object fields. 这些是我在设计不可变类时所做的初步检查点。 但是还有一个问题,我的对象仍然可以通过javareflection进行修改,对不对? 或者我在课堂上错过了什么? 提前致谢。