首页 > 其他分享 >11 临界区与竞态条件

11 临界区与竞态条件

时间:2023-06-29 23:35:09浏览次数:31  
标签:11 Runnable Thread void 临界 static new 竞态

11 临界区与竞态条件

临界区 Critical Section

  • 一个程序运行多个线程本身是没有问题的

  • 问题出在多个线程访问共享资源

    • 多个线程读共享资源其实也没有问题

    • 在多个线程对共享资源读写操作时发生指令交错,就会出现问题

  • 一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区

例如,下面代码中的临界区:

static int counter = 0;
static void increment() 
// 临界区
{ 
counter++;
}
static void decrement() 
// 临界区
{ 
counter--;
}

竞态条件 Race Condition

多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件

临界区资源加锁和不加锁的代码演示

//对临界区不加锁,会产生不正确的答案
public class CriticalZoneAndLock {
   static int count = 0;
   static Object lock = new Object();
   public static void main(String[] args) throws InterruptedException {
       Runnable task1 = new Runnable() {
           @Override
           public void run() {
               //对临界区资源加同一把锁
//                synchronized (lock){
                   //临界区
                   for (int i = 0; i < 5000; i++) {
                       count++;
                   }
//                }

           }
       };

       Runnable task2 = new Runnable() {
           @Override
           public void run() {
               //对临界区资源加同一把锁
               //synchronized (lock){
                   //临界区
                   for (int i = 0; i < 5000; i++) {
                       count--;
                   }
               }
           //}
       };
       Thread t1 = new Thread(task1, "t1");
       Thread t2 = new Thread(task2, "t2");

       t1.start();
       t2.start();
       t1.join();
       t2.join();

       System.out.println(count);
   }
}

结果:

-272(这个数是随机的)

public class CriticalZoneAndLock {
   static int count = 0;
   static Object lock = new Object();

   public static void main(String[] args) throws InterruptedException {
       Runnable task1 = new Runnable() {
           @Override
           public void run() {
               //对临界区资源加同一把锁
               synchronized (lock) {
                   //临界区
                   for (int i = 0; i < 5000; i++) {
                       count++;
                   }
               }
           }
       };

       Runnable task2 = new Runnable() {
           @Override
           public void run() {
               //对临界区资源加同一把锁
               synchronized (lock) {
                   //临界区
                   for (int i = 0; i < 5000; i++) {
                       count--;
                   }
               }
           }
       };
       Thread t1 = new Thread(task1, "t1");
       Thread t2 = new Thread(task2, "t2");

       t1.start();
       t2.start();
       t1.join();
       t2.join();

       System.out.println(count);
   }
}

结果:

0

标签:11,Runnable,Thread,void,临界,static,new,竞态
From: https://www.cnblogs.com/miaoyindian/p/17515463.html

相关文章

  • Vue实现组件间通信的11种方式
    原文合集地址如下,有需要的朋友可以关注本文地址合集地址组件之间的通信是指不同组件之间在共享数据、传递消息或触发事件等方面进行交流和协作的过程。在应用程序中,不同的组件可能需要相互传递数据、共享状态、触发动作或响应事件等,以实现组件之间的协调和交互。vue组件之间的......
  • day114- 动态sql
    动态SQL解决拼接SQL语句字符串时的问题。if标签if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行<!--List<Emp>getEmpByCondition(Empemp);--><selectid="getEmpByCondition"resultType="com.gu.mybatis.poj......
  • 11celery介绍架构和安装,celery执行异步任务,包结构celery,celery执行延迟任务和定时任务
    1celery介绍架构和安装#celery:分布式的异步任务框架,主要用来做: -异步任务-延迟任务-定时任务---》如果只想做定时任务,可以不使用celery,有别的选择#celery框架,原理1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket)2)celery服务为为其他项目......
  • 11. 文件的读取与写入
    目录一、打开文件fopen()函数:errno判断fopen一次可以最多打开多少文件关于使用fopen创建的文件的权限分配二、关闭文件三、写入文件实例1:实现文件的复制实例3:计算文件大小(size)四、读取文件五、fread&fwrite1.1.定义1.2.实例该节主要讲述使用c语言如何实现文件的创建、读取、修......
  • FX110网:TigerWit老虎外汇口碑极差,建议投资者们远离!
    早在2021年,FX110就提醒过大家要远离TigerWit老虎外汇,FX110也陆续收到多位用户反馈,称TigerWit老虎不能出金,客服失联以及强制平仓等异常操作。然而截止到现在仍有不明真相的投资者在TigerWit老虎外汇进行投资,那到底是什么情况呢?事情经过2021年5月以来,陆续收到用户投诉:用户A 在T......
  • oracle 11g开机自启动
    oracle11g开机自启动vi/etc/oratabPROD:/u01/app/oracle/product/11.2.0/dbhome_1:Yvi/etc/rc.d/rc.localsu-oracle-lc"/u01/app/oracle/product/11.2.0/db_1/bin/dbstart"su-oracle-lc"/u01/app/oracle/product/11.2.0/db_1/bin/lsnrctlstatusli......
  • Vue.js项目在IE11白屏报错
    一、概述项目使用vue/cli4脚手架搭建的前端项目,vue版本为2.6.10。但开发环境的IE11打开显示白屏,F12打开显示:查明报错原因是:I.E.不支持ES6语法。二、解决方案(一)解决方案11、安装如下的依赖包:npminstall--save-devbabel-polyfill或npminstall--save@babel-polyfill2、mai......
  • FX110网:西班牙对10家未经授权的外汇交易商发出警告
    2023年6月26日,西班牙金融监管机构 对10家未经授权的外汇交易商发出警告。根据《证券市场法》第17条第二款(由10月23日第4/2015号皇家法令批准的重订文本),西班牙国家证券市场委员会(ComisiónNacionaldelMercadodeValores)警告,以下公司未获授权提供《西班牙证券市场法》第140条规......
  • windows10/11关闭更新
    windows10/11关闭更新1.regedit打开注册表2.依次打开:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings3.新建DWORDS32位值-->>键名:FlightSettingsMaxPauseDays值设置暂停更新天数4.打开windows设置-->>更新与安全-->>高级选项-->>暂停更新下选择暂停到......
  • 修改UEFI WIN10 WIN11 启动菜单名称 操作系统启动菜单名称
    修改UEFIWIN10WIN11启动菜单名称,操作系统启动菜单名称。 下载BOOTICE1.3.4:http://www.winwin7.com/soft/44267.html打开 BOOTICE,你系统是64位的就打开:BOOTICEx64_2016.06.17_v1.3.4.0.exe转到UEFI选项卡,点击“修改启动序列(B)”,修改“菜单标题”中的名称,保存即可。-......