草庐IT

可变性

全部标签

java - 锁定可变对象 - 为什么它被认为是一种不好的做法?

查看此answer.它说:Sixreallybadexamples;...lockingonamutablefield.e.g.synchronized(object){object=...;}锁定可变字段有什么问题?如果object被声明为final但不是不可变类怎么办? 最佳答案 这是一个坏主意,因为如果另一个线程更改了临界区中的引用,线程将不再看到相同的引用,因此它们将不会在同一对象上同步,从而不受控制地运行。示例:synchronized(lock1){lock1=newObject();sharedVariable++;}

Java 不可变列表

我目前正在构建一个LRU缓存,我需要在其中存储最后N个插入的项目。项目将被频繁插入(即许多写入操作),而读取操作通常会返回大量事件始终严格按顺序,尽管从缓存中的任意点开始。例如,假设缓存包含事件:[1,2,3,4,5,6]合法的读取操作是返回事件[2,3,4]上的迭代器。由于读取操作可能会长期存在,我想使用一种数据结构,在这种结构中我可以安全地为每次读取尝试迭代序列的逻辑副本,从而防止缓存读取从阻止任何后续写入。但是,使用原始JavaArrayList或LinkedList意味着制作完整副本的开销很大。我的问题:是否有任何第3方Java库提供类似于Scala的不可变数据结构,从而修改数

java - 如何从 java HashMap 获取不可变集合?

我需要从javaHashMap中获取一个集合,而映射中的更改稍后会反射(reflect)在集合中。我想使用Collection.toArray()来实现这一点,但它不起作用。结果Object[]也在改变(javadocs说返回的数组将是“安全的”,因为这个集合没有维护对它的引用)。有什么简单的方法可以做到这一点? 最佳答案 通过单个API调用无法做到这一点,您需要利用深度克隆。当您对原始文件进行更改时,克隆不会更改。这个主题之前已经在SO上讨论过,参见HowtocloneArrayListandalsocloneitscontent

【Java】Java中String不可变性的底层实现

人不走空                                          🌈个人主页:人不走空      💖系列专栏:算法专题⏰诗词歌赋:斯是陋室,惟吾德馨目录      🌈个人主页:人不走空      💖系列专栏:算法专题⏰诗词歌赋:斯是陋室,惟吾德馨1.不可变性的概念2.String的底层实现3.操作String对象4.不可变性的优点5.总结作者其他作品:在Java编程中,String类的不可变性是一个被广泛讨论和利用的特性。这种不可变性使得String对象在创建后无法被修改,从而保证了程序的安全性和线程安全性。本文将深入探讨Java中String不可变性的底层实现原理,

java - 如何使其中包含 Date 对象的类不可变?

这只是从学术学习的角度来看。我所知道的是,每当我们想让一些类不可变时,-它必须由最终原始字段组成-在对象构造期间引用不会转义-如果使用其他对象,那么这些对象也需要递归不可变或API不可变类,如java.lang.String,以及其他一些详细的注意事项!但我最近遇到了一个问题,其中面试官要求候选人创建一个不可变的类,其中包含java.util.Date。我的第一印象告诉我这是不可能的,尽管我们可以使用包含日期字符串而不是Date对象本身的String来解决问题。请澄清一下。谢谢。 最佳答案 要使类不可变,最简单的做法是创建Date对

java - 具有非最终字段的不可变对象(immutable对象)如何成为线程不安全的?

假设我们有这个//Thisistriviallyimmutable.publicclassFoo{privateStringbar;publicFoo(Stringbar){this.bar=bar;}publicStringgetBar(){returnbar;}}是什么让这个线程不安全?继此question. 最佳答案 Foo在安全发布后是线程安全的。例如,这个程序可以打印“不安全”(它可能不会使用热点/x86的组合)——如果你将bar设置为final,它就不会发生:publicclassUnsafePublication{st

java - 如何在java中创建不可变类

如何在java中创建不可变类。如果学生类有关系(地址)如何创建不可变类。我想让下面的类不可变finalpublicclassStudent{privatefinalAddressadd;privatefinalintsid;publicStudent(intsid,Stringname,Addressadd){super();this.sid=sid;this.name=name;this.add=add;}privatefinalStringname;publicintgetSid(){returnsid;}publicfinalStringgetName(){returnname;

java - guava的ImmutableXXX真的是不可变的吗?

我已经使用guava一段时间了并且非常信任它,直到昨天我偶然发现了一个例子,这让我开始思考。长话短说,这里是:publicstaticvoidtestGuavaImmutability(){StringBuilderstringBuilder=newStringBuilder("partOne");ImmutableListmyList=ImmutableList.of(stringBuilder);System.out.println(myList.get(0));stringBuilder.append("appended");System.out.println(myList.g

批次 - 用于循环 - 将每个结果保存为可变?

我有这个temp2.txt文件:name:XXX1name:XXX2我想在“:”后将每个单词保存到分开变量之后,以便我可以通过命令进一步处理它们。我正在努力:for/f"tokens=1,2delims=:"%%ain(C:\temp\temp2.txt)do(setuserloop1=%%bsetuserloop2=%%b)echo%userloop1%echo%userloop2%pause循环起作用,但每个变量都包含循环的最后一个事件,即XXX2。我想让userloop1返回xxx1和userloop2重新调整xxx2。如何调整循环以使其工作?太感谢了!看答案在下面使用迭代器延迟扩展:s

java - 使用 AspectJ 处理可变参数

我正在尝试使用AspectJ规范化应用程序中的URI。我正在捕获对使用此代码传入java.net.URI参数的方法进行的每个调用:Objectaround():execution(**(..,java.net.URI,..)){for(Objectarg:thisJoinPoint.getArgs()){if(arginstanceofURI){//normalize}}returnproceed();}但是,由于URI是不可变的,我无法将规范化值交换到现有对象中。我需要的是使用新的规范化URI对象调用proceed(并可能传递其他参数不变)。但是,proceed调用只允许我传递由连接