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。相当于其他线程把这个线程叫醒了。

posted @ 2020-03-16 20:12  PraveZ  阅读(245)  评论(0编辑  收藏  举报