美文网首页
同步----锁相关

同步----锁相关

作者: 爱做梦的严重精神病患者 | 来源:发表于2019-03-16 21:37 被阅读0次

1.死锁

  所有线程都被阻塞,这样的状态称为死锁。Java编程语言中没有任何东西可以避免或打破这种死锁现象。必须仔细设计程序,以确保不会出现死锁。

2.线程局部变量

  有时候为了避免在线程中共享变量,可以使用ThreadLocal辅助类为各个线程提供各自的实例

//创建一个线程局部变量,其初始值通过调用给定的supplier生成。
static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier)

3.锁测试

  tryLock方法试图申请一个锁,在成功获得锁后返回true,否则,立即返回false,而且线程可以立即离开去做其他事情。

if (myLock.tryLock()) {
    //now the thread owns the lock
    try{...}
    finally{myLock.unlock();}
} else
//do something else

4.读/写锁

  如果很多线程从一个数据结构读取数据,而很少线程修改其中数据,这时使用ReentrantReadWriteLock类是很有必要的。在这种情况下,允许多个读操作共用一个读锁是合适的。写者线程依然必须是互斥访问的。

下面是使用读/写锁的必要步骤:
1.构造一个ReentrantReadWriteLock对象:
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

2.抽取读锁和写锁:
//得到一个可以被多个读操作共用的读锁,但会排斥所有写操作
private Lock readLock = rwl.readLock();
//得到一个写锁,排斥所有其他的读操作和写操作
private Lock writeLock = rwl.writeLock();

3.对所有的获取方法加读锁:
public double getTotalBalance() {
        readLock.lock();
        try{...};
        finally{readLock.unlock();}
}

4.对所有的修改方法加锁:
public void transfer(...) {
      writeLock.lock();
      try{...}
      finally{writeLock.unlock();}
}

相关文章

网友评论

      本文标题:同步----锁相关

      本文链接:https://www.haomeiwen.com/subject/echemqtx.html