zoukankan      html  css  js  c++  java
  • Java synchronized 基础使用

    synchronized作用在不同位置,使用的锁不同,但是作用是一样的。被synchronized修饰的部分,必须持有锁,才能运行,否则就要等待。

    作用位置

    作用在静态方法上,将整个类作为锁,同时只能有一个线程访问这个类。锁 = Class.class

    作用在普通方法上,将类作为锁,锁 = this

    作用在某个具体锁上,锁 = Object

    wait() notify()方法

    wait()

    在已经持有锁的线程的代码中,使用锁.wait()可以释放锁,让其他在排队的获得锁,自己进入【等待池】,在被notify前,不会再去试图拿到锁去运行后面的内容。

    notify() notifyAll()

    在已经持有锁的线程的代码中,使用锁.notify()将在【等待池】中的一个线程拉回【竞争池】中,使其可以继续竞争锁。
    notifyAll()是把所有等待池的都拉回竞争池。

    等待池,竞争池

    在一开始时,所有线程都在竞争池中,某个线程拿到锁,开始执行,其他的线程保持不动,继续试图拿锁。
    当某个已经拿到锁的线程调用锁.wait()方法时,将其转入等待池,放弃对锁的拥有权,并且不再参与竞争锁。
    当某个已经拿到锁的线程调用锁.notify()方法时,一般是这个线程用完了锁,随机召唤一个在等待池的线程回到竞争池参与锁的竞争,但是不保证从等待池回来的一定能拿到锁,因为只是恢复了它的竞争机会。

    wait() 和 sleep()

    wait()会放弃锁,sleep()不会。
    sleep(long )long毫秒后继续执行;wait(long )long毫秒后释放锁进入等待池。
    对正在sleep()的线程调用interrupt()方法会触发sleep() throw一个Interrupt,结束sleep。相当于其他线程把这个线程叫醒了。

  • 相关阅读:
    Delphi 2005 以上版本GIF动画播放设置
    WIN7中盾牌的编程-DELPHI
    Delphi中ComPort通信中的数据处理
    【ZJOI2008】树的统计(树链剖分)
    【CJOJ2440】大话西游(树链剖分)
    【洛谷3384】【模板】树链剖分
    【NOI2004】郁闷的出纳员(splay)
    【HNOI2004】宠物收养所(splay)
    【HNOI 2002 】营业额统计(splay)
    【Tyvj 1728】普通平衡树
  • 原文地址:https://www.cnblogs.com/pravez/p/12506201.html
Copyright © 2011-2022 走看看