• 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)

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



  • 相关阅读:
    沙漠之王(0/1分数规划+ 最小生成树)
    野餐规划(最小生成树性质)⭐
    走廊泼水节(最小生成树定理)⭐
    兄弟选择器+否定伪类
    子元素的伪类
    属性选择器
    伪元素
    伪类选择器
    Java连接Mysql由于版本更新报错
    Mac下安装SQL
  • 原文地址:https://www.cnblogs.com/lwcoding/p/6678292.html
Copyright © 2020-2023  润新知