一个对象引用的思考

一个有趣且令人困惑的代码片段

Code A:

final ConcurrentHashMap<String, Ref> REFS_MAPS = new ConcurrentHashMap<String, Ref>();
	
public void put(String key) {
  Ref ref = new Ref(key, "1");
  ref = new Ref(key, "2");
  REFS_MAPS.put(key, ref);
}

public Ref get(String key) {
  return REFS_MAPS.get(key);
}

它有可能会得到"1"吗?

错误的解释

在多线程调度的情况下,相同的 key 多次同时调用 put 和 get 方法,从 REFS_MAPS 方法 get 时,正好 put 运行到 Ref ref = new Ref(key, "1"),所以就得到了“1”的值,如下所示:

这个解释是错误的,不会得到“1”。

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。