Java多线程学习笔记(二)-各种锁

一、synchroinized 的功能扩展:重入锁

jdk6.0以后,重入锁和synchronized之间的性能差距已经不大了。

1、ReentrantLock的使用:

       lock.lock(); //加锁
      ...
       lock.unlock(); //释放锁

       优点:
        a、有明显的操作工程,开发人员手动指定何时加锁,何时释放锁。灵活性好。

        b、一个线程可以连续多次获得同一把锁,即多次调用 lock()方法。

        c、可以中断处理: synchronized 要么得到锁继续执行,要么保持等待。

              ReentrantLock: synchronized的这两种状态外,还可以取消对锁的请求,即不再等待了。

         d、ReentrantLock.lockInterruptibly() 方法: 可以对中断进行响应的锁申请动作,即在等待锁的过程中
             可以响应中断。

2、公平锁, new ReentrantLock(true), 根据系统的调度,一个线程会倾向于再次获得已经持有的锁。

这种方式是高效的,但毫无公平性可言。

3、重入锁的几个重要方法:

    a、lock(); 获得锁,如果锁已经被占用,则等待。

    b、unlock(); 释放锁

    c、tryLock(): 尝试获得锁,如果成功,则返回 true, 失败返回false。该方法不等待,立即返回。

     d、tryLock(long time, TimeUnit unit): 在给定的时间内尝试获得锁。

4、Condition 条件:

   a、await(): 使当前线程等待,同时释放当前锁,当其他线程中使用 signal()或signalAll()方法时,线程会重新获得锁并继续执行。或者当线程被中断时,也能跳出等待。与Object.wait()的方法很相似哪里不同?

  b、awaitUninterruptibly()方法与 await()方法基本相同,但是它并不会再等待过程中响应中断。

  c、singal()方法用于唤醒一个在等待中的线程。相对的singalAll()方法会唤醒所用在等待中的线程。

5、Semaphore 信号量:可以指定多个线程,同时访问某一个资源。

问题:

1、CAS操作?

2、阻塞原语:park(), unpark()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值