Java中非线程安全的类如何转换成线程安全的类?
如题,非线程安全的类如何转换成线程安全的类?
有哪些方法,怎么用?
------解决方案--------------------加线程锁
synchronized(锁){
临界区代码
}
------解决方案--------------------线程安全不安全其实是方法的访问/变量的访问。
在你需要线程安全的地方加上锁/同步方法(变量),此时就是线程安全的
------解决方案--------------------最简单的就是加锁了
------解决方案-------------------- 如何将一个类改造为线程安全
对这个问题,好多人可能第一反应就是使用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