Comments (5)
标准的dcl 会添加 volatile 关键词来防止 指令重排, 这里 instance 指令增加了volatile 可以防止以下两个指令重排序的问题导致其他线程拿到了 instance 对象,而该对象确没有完成实例化
from guide-rpc-framework.
不知道在上述情况下是否需要 添加 volatile 来防止上述问题
请大神解答一下我的疑惑
from guide-rpc-framework.
public static <T> T getInstance(Class<T> c) { String key = c.toString(); Object instance = null; if (instance == null) { synchronized (SingletonFactory.class) { instance = OBJECT_MAP.get(key); if (instance == null) { try { instance = c.getDeclaredConstructor().newInstance(); OBJECT_MAP.put(key, instance); } catch (IllegalAccessException | InstantiationException e) { throw new RuntimeException(e.getMessage(), e); } catch (NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); } } } } return c.cast(instance); }这一段感觉在模仿标准的 dcl 写法,但是
Object instance = null; if (instance == null) { synchronized (SingletonFactory.class) {明显 instance 肯定为空,判断多余,且synchronized (SingletonFactory.class) { 使用 类锁,锁的力度很大,在多线程情况下并发度很低阻塞会很严重
这里直接把最外层判断 instance 对象是否为空给移除就可以了吧!
from guide-rpc-framework.
public static <T> T getInstance(Class<T> c) { String key = c.toString(); Object instance = null; if (instance == null) { synchronized (SingletonFactory.class) { instance = OBJECT_MAP.get(key); if (instance == null) { try { instance = c.getDeclaredConstructor().newInstance(); OBJECT_MAP.put(key, instance); } catch (IllegalAccessException | InstantiationException e) { throw new RuntimeException(e.getMessage(), e); } catch (NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); } } } } return c.cast(instance); }这一段感觉在模仿标准的 dcl 写法,但是
Object instance = null; if (instance == null) { synchronized (SingletonFactory.class) {明显 instance 肯定为空,判断多余,且synchronized (SingletonFactory.class) { 使用 类锁,锁的力度很大,在多线程情况下并发度很低阻塞会很严重
这里直接把最外层判断 instance 对象是否为空给移除就可以了吧!
这不行把,那所有的对象获取,都会进入锁竞争嘛。那效率就会很低
from guide-rpc-framework.
public static <T> T getInstance(Class<T> c) { String key = c.toString(); Object instance = null; if (instance == null) { synchronized (SingletonFactory.class) { instance = OBJECT_MAP.get(key); if (instance == null) { try { instance = c.getDeclaredConstructor().newInstance(); OBJECT_MAP.put(key, instance); } catch (IllegalAccessException | InstantiationException e) { throw new RuntimeException(e.getMessage(), e); } catch (NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); } } } } return c.cast(instance); }这一段感觉在模仿标准的 dcl 写法,但是
Object instance = null; if (instance == null) { synchronized (SingletonFactory.class) {明显 instance 肯定为空,判断多余,且synchronized (SingletonFactory.class) { 使用 类锁,锁的力度很大,在多线程情况下并发度很低阻塞会很严重
这里直接把最外层判断 instance 对象是否为空给移除就可以了吧!
这不行把,那所有的对象获取,都会进入锁竞争嘛。那效率就会很低
已经确认您的PR了 老哥
from guide-rpc-framework.
Related Issues (20)
- github.javaguide.provider.impl.ZkServiceProviderImpl类中为什么有serviceMap,还需要registeredService这个set去保存接口名? HOT 1
- 无法远程调用无参方法 HOT 2
- 请问如果远程接口有多个实现类怎么办 HOT 1
- 请问自定义RPC协议的设计思路是如何? HOT 1
- 请问服务宕机了,zk能感知到吗 HOT 4
- SPI实现的一点小疑问 HOT 2
- RPC服务调用方法参数传递为Java类对象 HOT 3
- 发现个小问题 HOT 1
- CollectionUtils & StringUtils HOT 1
- 一致性hash中,相同入参无法路由到同一个服务 HOT 3
- 关于服务提供者下线后重新上线,不通过重启客户端无法被服务提供者感知 HOT 1
- 有个问题有人可以解答一下吗? HOT 1
- ExtensionLoader类获取实现类的时候,为什么要加双重锁 HOT 1
- 并发情况下,应该会创建多条连接吧?
- InetAddress.getLocalHost().getHostAddress(); HOT 1
- zookeeper 的 watch 机制导致的问题 HOT 1
- zookeeper版本和curator版本不匹配导致的问题 HOT 1
- 获取rpcServiceName的时候直接用接口名、version、group相加是不是不太好 HOT 1
- 序列化方式Kryo写错了
- RpcRequestHandler优化 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from guide-rpc-framework.