zoukankan      html  css  js  c++  java
  • 六 多线程问题

    问题1: 什么是Re-entrant Lock

      锁的acquire是per thread 的, 而不是per call的,也就是同一个线程再次申请已经获得的锁,直接成功返回。如果是非re-entrant的锁,一个线程试图获取已经获得的锁会死锁,因为当前线程会挂起,没有机会release锁

    synchronized的锁和 ReentrantLock都是 Re-entrant Lock。

    问题2: java已经有了synchronized,为什么还要在jdk1.5中加入Lock系列?

    ReentrantLock 和 synchronized有相同的语义,但是有更高的性能,ReentrantLock 使用原子变量来维护等待锁定的线程队列。

    synchronized获取锁的时候只能一直等,没有超时机制,也不能被打断,而且锁的获取和释放必须在一个方法内

    而ReentrantLock的lock方法和synchronized是等同语义的,还可以通过tryLock等方法有多种选择,并且以接口和类的形式而不是语言feature的形式存在,更好扩展。

    [java] view plain copy
     
    1. public interface Lock {  
    2.     void lock();  
    3.     void lockInterruptibly() throws InterruptedException;  
    4.     boolean tryLock();  
    5.     boolean tryLock(long time, TimeUnit unit) throws InterruptedException;  
    6.     void unlock();  
    7.     Condition newCondition();  
    8. }  

    Lock的确缺点是必须在finally块中 unlock

    问题7 用ReentrantLock代替synchronized后, 需要用wait, notify的时候怎么办?

         wait和notify是synchronized用的, ReentrantLock使用condition的await和singal。

    问题8 锁的等待队列,是先申请的线程先获取吗?

  • 相关阅读:
    MySql 数据类型
    MySql 数据库的增删改
    MySql 联合查询
    Mysql 库的管理 --->>>>DDL
    MySql 子查询
    MySql 分页查询
    sql99语法的连接查询
    MySql 连接查询
    MySql 分组函数
    jQ处理页面中尺寸过大的图片
  • 原文地址:https://www.cnblogs.com/liufei1983/p/8120391.html
Copyright © 2011-2022 走看看