Java线程饥饿

news/2024/11/17 10:37:02/

当连续不断拒绝线程访问资源并因此无法取得进展时,就会发生饥饿。当贪婪的线程长时间使用共享资源时,通常会发生这种情况。如果这种情况持续了很长时间,则线程没有获得足够的CPU时间或对资源的访问将无法取得足够的进展,从而导致线程不足。线程饥饿的可能原因之一是不同线程或线程组之间的线程优先级不正确。

另一个可能的原因可能是使用非终止循环(无限循环)或在特定资源上等待过多时间,同时保留了其他线程所需的关键锁。

通常建议尽量避免修改线程优先级,因为这是导致线程饥饿的主要原因。一旦开始使用线程优先级调整应用程序,它就会与特定平台紧密耦合,并且还会带来线程匮乏的风险。

Java线程饥饿示例

在我的示例中,我将总共创建五个线程。每个线程将被分配一个不同的线程优先级。创建线程并分配优先级后,我们将继续并启动所有五个线程。在主线程中,我们将等待5000ms或5秒,并将isActive标志更改为false,以便所有线程退出while循环并进入死线程状态。

实现Runnable接口的Worker类正在互斥对象(对象)上进行同步,以模拟线程锁定代码的关键部分,即使我确实对AtomicInteger使用并发类也可以执行getAndIncrement操作并且不需要锁定。我正在使用一个计数器,以便我们可以计数并查看每个工作线程执行工作的频率。作为一般准则,优先级较高的线程应获得更多的CPU周期,因此,优先级较高的线程的值应更大。

注意

Windows实现了一种线程回退机制,通过该机制,可以使长时间没有机会运行的线程获得临时的优先级提升,因此几乎无法实现完全的饥饿。但是,从我生成的数字中,您可以看到线程优先级如何对分配给线程5的CPU时间量有相当大的影响。

线程饥饿示例

package com.example.thread.lockstarvation;public class BankAccount {private double balance;int id;BankAccount(int id, double balance) {this.id = id;this.balance = balance;}synchronized double getBalance() {// Wait to simulate io like database access ...try {Thread.sleep(100l);} catch (InterruptedException e) {}return balance;}synchronized void withdraw(double amount) {balance -= amount;}synchronized void deposit(double amount) {balance += amount;}synchronized void transfer(BankAccount to, double amount) {withdraw(amount);to.deposit(amount);}public static void main(String[] args) {final BankAccount fooAccount = new BankAccount(1, 500d);final BankAccount barAccount = new BankAccount(2, 500d);Thread balanceMonitorThread1 = new Thread(new BalanceMonitor(fooAccount), "BalanceMonitor");Thread transactionThread1 = new Thread(new Transaction(fooAccount, barAccount, 250d), "Transaction-1");Thread transactionThread2 = new Thread(new Transaction(fooAccount, barAccount, 250d), "Transaction-2");balanceMonitorThread1.setPriority(Thread.MAX_PRIORITY);transactionThread1.setPriority(Thread.MIN_PRIORITY);transactionThread2.setPriority(Thread.MIN_PRIORITY);// Start the monitorbalanceMonitorThread1.start();// And later, transaction threads tries to execute.try {Thread.sleep(100l);} catch (InterruptedException e) {}transactionThread1.start();transactionThread2.start();}}class BalanceMonitor implements Runnable {private BankAccount account;BalanceMonitor(BankAccount account) {this.account = account;}boolean alreadyNotified = false;@Overridepublic void run() {System.out.format("%s started execution%n", Thread.currentThread().getName());while (true) {if (account.getBalance() <= 0) {// send email, or sms, clouds of smoke ...break;}}System.out.format("%s : account has gone too low, email sent, exiting.", Thread.currentThread().getName());}}class Transaction implements Runnable {private BankAccount sourceAccount, destinationAccount;private double amount;Transaction(BankAccount sourceAccount, BankAccount destinationAccount, double amount) {this.sourceAccount = sourceAccount;this.destinationAccount = destinationAccount;this.amount = amount;}public void run() {System.out.format("%s started execution%n", Thread.currentThread().getName());sourceAccount.transfer(destinationAccount, amount);System.out.printf("%s completed execution%n", Thread.currentThread().getName());}}

 


http://www.ppmy.cn/news/247665.html

相关文章

IIS-网站报500.19错误代码0x8007000d问题解决

错误信息 HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面&#xff0c;因为该页的相关配置数据无效。 情景 本地编译&#xff0c;本地调式&#xff0c;完全没有问题&#xff0c;发布至原服务器上也没有问题&#xff0c;但是&#xff0c;在发布至新的服务器上就…

【管理篇 / 登录】❀ 01. 网线连接登录 ❀ FortiGate 防火墙

【简介】当我们拿到新的防火墙的时候&#xff0c;首先要做的就是将电脑快速、简便的连接到防火墙&#xff0c;登录并进行管理&#xff0c;而最方便的连接方式就是用网线了。这里介绍的是最简单的飞塔防火墙物理连接以及浏览器登录访问。 桌面式防火墙网线连接 飞塔防火墙产品线…

【接口篇 / Wan】(5.2) ❀ 01. ADSL 拨号宽带上网 ❀ FortiGate 防火墙

【简介】除了单位使用的固定IP宽带之外&#xff0c;使用最多的就是ADSL拨号宽带了&#xff0c;不光家庭普遍使用&#xff0c;大部分单位也会使用。ADSL拨号宽带价廉物美&#xff0c;唯一的缺陷是每次拨号成功会生成不同的外网IP。 配置接口 首先将ADSL拨号宽带线路接入到防火墙…

飞塔500D宽带拨号配置

飞塔防火墙桌面级的设备可以通过Web进行PPPOE设置&#xff0c;飞塔500D Web页面无法配置PPPOE&#xff0c;只能进入命令行模式进行配置。配置命令&#xff1a; config system interface /进入接口配置子系统edit /指定接口set mode pppoe /设定模式为PPPoEset username /设定PP…

第五章 光学系统中成像光束的选择

一、光阑及其作用 透镜口径与成像光束的大小和位置有关。 1. 照相机中的光阑 光阑是在照相镜头后面有多个金属叶片包络形成的圆孔&#xff0c;也称为光圈。 2. 光阑类型 孔径光阑&#xff1a;限制进入光学系统成像光束口径的光阑。视场光阑&#xff1a;限制成像范围的光阑…

elasticsearch高级功能之聚合查询

elasticsearch高级功能之聚合查询&#xff0c;是比较复杂的的高级功能&#xff0c;其中包含相关的统计功能&#xff0c;比如最大值、最小值、平均值、求和等&#xff0c;又比如筛选完数据后&#xff0c;还需要过滤筛选项&#xff0c;今天我们详细分析一下&#xff1a; 一、聚合…

超好用的网站推荐(持续更新)

1 在线学习 1.1 网课学习 网易公开课 链接&#xff1a;https://open.163.com/ 中国大学MOOC 链接&#xff1a;https://www.icourse163.org/ 哔哩哔哩 链接&#xff1a;https://www.bilibili.com/ 学堂在线 链接&#xff1a;http://www.xuetangx.com/ 斯坦福大学&#xff0…

科研常用网站汇总

工欲善其事&#xff0c;必先利其器 论文写作&学术 总则&#xff1a;学术&#xff0c;学术。不学&#xff0c;无术&#xff01; 为什么现在很多人工智能做的比人好&#xff0c;因为你给它东西&#xff0c;它真学啊doge。 下面的网站随时可能失效&#xff0c;我就不更新了&…