Java中非线程安全的类如何转换成线程安全的类?

wyhap216i 2013-10-20 08:34:35
如题,非线程安全的类如何转换成线程安全的类?
有哪些方法,怎么用?
...全文
183 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
我的波塞冬 2013-10-21
  • 打赏
  • 举报
回复
不错,学习了。
失落夏天 2013-10-20
  • 打赏
  • 举报
回复
如何将一个类改造为线程安全 对这个问题,好多人可能第一反应就是使用syschronized关键字,诚然应用这个关键字可以解决问题(仍是有条件线程安全的且低效的),但是在无意中看java源码时,看到了另一种更高效的方式—采用lock的方式。 在ReentrantReadWriteLock的源码注释中,作者写了这样一段代码: class RWDictionary { private final Map<String, Data> m = new TreeMap<String, Data>(); private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private final Lock r = rwl.readLock(); private final Lock w = rwl.writeLock(); public Data get(String key) { r.lock(); try { return m.get(key); } finally { r.unlock(); } } public String[] allKeys() { r.lock(); try { return m.keySet().toArray(); } finally { r.unlock(); } } public Data put(String key, Data value) { w.lock(); try { return m.put(key, value); } finally { w.unlock(); } } public void clear() { w.lock(); try { m.clear(); } finally { w.unlock(); } } } 这段代码同样实现了对TreeMap本来非线程安全的类,包装成了一个线程安全的类,且不存在Collections.SynchronizedMap的put_if_absent问题。 http://www.cnblogs.com/weiwelcome0/archive/2012/05/25/2518558.html
浪里花 2013-10-20
  • 打赏
  • 举报
回复
最简单的就是加锁了
teemai 2013-10-20
  • 打赏
  • 举报
回复
线程安全不安全其实是方法的访问/变量的访问。 在你需要线程安全的地方加上锁/同步方法(变量),此时就是线程安全的
keke8247 2013-10-20
  • 打赏
  • 举报
回复
加线程锁 synchronized(锁){ 临界区代码 }

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧