java多线程——饥饿和公平

一、概念

饥饿:如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为“饥饿”;

 

二、饥饿原因

  1. 高优先级线程吞噬所有的低优先级线程的 CPU 时间。
  2. 线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问。
  3. 线程在等待一个本身(在其上调用 wait())也处于永久等待完成的对象,因为其他线程总是被持续地获得唤醒。

三、公平性

      1、用锁代替同步代码块

public class Synchronizer{
    Lock lock = new Lock();
    public void doSynchronized() throws InterruptedException{
        this.lock.lock();
        //critical section, do a lot of work which takes a long time
        this.lock.unlock();
    }
}

2、公平锁


四、java中的锁

1、锁的可重入性
如果一个线程已经拥有了一个管程对象上的锁,那么它就有权访问被这个管程对象同步的所有代码块。这就是可重入。

2、锁的公平性
在finally中调用unlock()

3、读写锁(
java.util.concurrent.locks.ReadWriteLock)

假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。
在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。
但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写。



posted @ 2017-04-07 15:22  牛哥学coding  阅读(2431)  评论(0编辑  收藏  举报