💥 Задача: Почему эта структура «ломается» в многопоточной среде?
import java.util.*;
public class BrokenImmutable { private final Map<String, List<String>> data;
public BrokenImmutable(Map<String, List<String>> input) { this.data = Collections.unmodifiableMap(input); }
public Map<String, List<String>> getData() { return data; }
public static void main(String[] args) { Map<String, List<String>> base = new HashMap<>(); base.put("key", new ArrayList<>(List.of("a")));
BrokenImmutable bi = new BrokenImmutable(base); Map<String, List<String>> d = bi.getData();
d.get("key").add("🚨");
System.out.println(bi.getData()); } }
🔍 Разбор: С первого взгляда кажется, что BrokenImmutable — иммутабельный класс. Мы оборачиваем Map через Collections.unmodifiableMap, и поле data — final.
Но проблема в глубине структуры.
unmodifiableMap запрещает перезапись ключей, но не делает элементы внутри truly immutable. В данном случае, значение по ключу "key" — это ArrayList, которую легко модифицировать.
💣 В main() мы получили доступ к внутреннему списку и… тихо сломали инвариант класса, добавив "🚨".
✅ Решение: Чтобы сделать структуру действительно иммутабельной, нужно:
Копировать и оборачивать значения внутри Map.
Сделать глубокую защиту:
public BrokenImmutable(Map<String, List<String>> input) { Map<String, List<String>> copy = new HashMap<>(); for (Map.Entry<String, List<String>> e : input.entrySet()) { copy.put(e.getKey(), List.copyOf(e.getValue())); // immutable list } this.data = Map.copyOf(copy); // immutable map }
Теперь никто не сможет мутировать data, даже если получит на него ссылку.
🧠 Вопрос на подумать: А что если вместо ArrayList внутри Map был бы CopyOnWriteArrayList или ImmutableList от Guava? Почему CopyOnWriteArrayList — тоже плохой выбор для truly immutable структур?
💥 Задача: Почему эта структура «ломается» в многопоточной среде?
import java.util.*;
public class BrokenImmutable { private final Map<String, List<String>> data;
public BrokenImmutable(Map<String, List<String>> input) { this.data = Collections.unmodifiableMap(input); }
public Map<String, List<String>> getData() { return data; }
public static void main(String[] args) { Map<String, List<String>> base = new HashMap<>(); base.put("key", new ArrayList<>(List.of("a")));
BrokenImmutable bi = new BrokenImmutable(base); Map<String, List<String>> d = bi.getData();
d.get("key").add("🚨");
System.out.println(bi.getData()); } }
🔍 Разбор: С первого взгляда кажется, что BrokenImmutable — иммутабельный класс. Мы оборачиваем Map через Collections.unmodifiableMap, и поле data — final.
Но проблема в глубине структуры.
unmodifiableMap запрещает перезапись ключей, но не делает элементы внутри truly immutable. В данном случае, значение по ключу "key" — это ArrayList, которую легко модифицировать.
💣 В main() мы получили доступ к внутреннему списку и… тихо сломали инвариант класса, добавив "🚨".
✅ Решение: Чтобы сделать структуру действительно иммутабельной, нужно:
Копировать и оборачивать значения внутри Map.
Сделать глубокую защиту:
public BrokenImmutable(Map<String, List<String>> input) { Map<String, List<String>> copy = new HashMap<>(); for (Map.Entry<String, List<String>> e : input.entrySet()) { copy.put(e.getKey(), List.copyOf(e.getValue())); // immutable list } this.data = Map.copyOf(copy); // immutable map }
Теперь никто не сможет мутировать data, даже если получит на него ссылку.
🧠 Вопрос на подумать: А что если вместо ArrayList внутри Map был бы CopyOnWriteArrayList или ImmutableList от Guava? Почему CopyOnWriteArrayList — тоже плохой выбор для truly immutable структур?
Spiking bond yields driving sharp losses in tech stocks
A spike in interest rates since the start of the year has accelerated a rotation out of high-growth technology stocks and into value stocks poised to benefit from a reopening of the economy. The Nasdaq has fallen more than 10% over the past month as the Dow has soared to record highs, with a spike in the 10-year US Treasury yield acting as the main catalyst. It recently surged to a cycle high of more than 1.60% after starting the year below 1%. But according to Jim Paulsen, the Leuthold Group's chief investment strategist, rising interest rates do not represent a long-term threat to the stock market. Paulsen expects the 10-year yield to cross 2% by the end of the year.
A spike in interest rates and its impact on the stock market depends on the economic backdrop, according to Paulsen. Rising interest rates amid a strengthening economy "may prove no challenge at all for stocks," Paulsen said.
How Does Bitcoin Work?
Bitcoin is built on a distributed digital record called a blockchain. As the name implies, blockchain is a linked body of data, made up of units called blocks that contain information about each and every transaction, including date and time, total value, buyer and seller, and a unique identifying code for each exchange. Entries are strung together in chronological order, creating a digital chain of blocks. “Once a block is added to the blockchain, it becomes accessible to anyone who wishes to view it, acting as a public ledger of cryptocurrency transactions,” says Stacey Harris, consultant for Pelicoin, a network of cryptocurrency ATMs. Blockchain is decentralized, which means it’s not controlled by any one organization. “It’s like a Google Doc that anyone can work on,” says Buchi Okoro, CEO and co-founder of African cryptocurrency exchange Quidax. “Nobody owns it, but anyone who has a link can contribute to it. And as different people update it, your copy also gets updated.”