黑马程序员技术交流社区

标题: 同步疑问? [打印本页]

作者: 文江江    时间: 2014-3-13 17:33
标题: 同步疑问?
本帖最后由 文江江 于 2014-3-13 23:20 编辑

实现线程的同步,除了使用synchronized,还有什么方法呢?
作者: itpower    时间: 2014-3-13 17:57
在jdk1.5以后,java 有了新的锁,那就是lock,而且还退出了替代以前的wait和notify的Condition,
如果程序不使用synchronized关键字来保证同步,而是直接使用Lock对象来
保证同步,则系统中不存在隐式的同步监视器,也就不能用wait()、notify()、notifyAll()方法进行线程通信了。当使用Lock对象
来保证同步时,Java提供了Condition类来协调线程间的通信。

作者: 一年_Hei    时间: 2014-3-13 19:30
JDK1.5以后用一个Lock代替synchronized,等待机制用Condition代替
作者: 艮昕辶    时间: 2014-3-13 21:36
可以使用lock 来保证多线程同步
如果只是想让线程顺序执行某个方法,比如
原方法
Java code
public synchronized void method1(){
    //do something here
}

使用lock
Java code
private final ReentrantLock lock = new ReentrantLock();
public void mehtod1(){
    lock.lock();
    try{
        //do something here
    }finally{
        lock.unlock();
    }

}


还有一种可能是为了缓存数据并发性更好,比如某个类中有一个数据集用于做缓存的,为了让读写性能更佳(原方法不举例,因为不试过)
Java code

class RWDictionary {
    //缓存集合 m
    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(); }
    }
}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2