【发布时间】:2015-01-13 14:44:06
【问题描述】:
鉴于我对 java 中并发的理解,似乎只有当线程访问给定对象(例如 servlet)的同一实例时,对实例成员的共享访问才能处理多线程访问。请参见此处: Why instance variable in Servlet is not thread-safe
由于并非所有应用程序都是基于 servlet,你如何确定哪些对象需要适应多线程访问?例如,在一个大型的、非基于 servlet 的企业应用程序中,考虑到类的绝对数量,您如何从设计的角度确定哪些对象在运行时将只有一个实例在多个线程之间共享?我能想到的唯一情况就是单身。
在 Java 的 EL API 中,javax.el.BeanELResolver 有一个私有内部类,它使用同步来序列化对其成员之一的访问。除非我遗漏了什么,否则 BeanELResolver 看起来并不像单例,因此每个线程都应该有自己的 BeanELResolver 实例。同步其成员之一背后的设计考虑因素是什么?
【问题讨论】:
-
同步是一种安全措施。如果实例的 reference 转义,您应该在多线程环境中使用它。
-
在编写类之前你应该知道实例是否会被并发使用。这是编码人员必须在其实现中允许的应用程序设计选择。
-
这是一个复杂的主题 - 最好的建议是阅读 Brian Goetz 的 Java Concurrency in Practice - 所有你需要知道的都在里面。
标签: java multithreading concurrency