A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 文江江 中级黑马   /  2014-3-13 17:33  /  1040 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 文江江 于 2014-3-13 23:20 编辑

实现线程的同步,除了使用synchronized,还有什么方法呢?

3 个回复

倒序浏览
在jdk1.5以后,java 有了新的锁,那就是lock,而且还退出了替代以前的wait和notify的Condition,
如果程序不使用synchronized关键字来保证同步,而是直接使用Lock对象来
保证同步,则系统中不存在隐式的同步监视器,也就不能用wait()、notify()、notifyAll()方法进行线程通信了。当使用Lock对象
来保证同步时,Java提供了Condition类来协调线程间的通信。
回复 使用道具 举报
JDK1.5以后用一个Lock代替synchronized,等待机制用Condition代替
回复 使用道具 举报
可以使用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(); }
    }
}


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马