当前位置: 首页 > news >正文

医院网站建设怎么设置百度快速收录权限

医院网站建设怎么设置,百度快速收录权限,郑州网站服务外包公司,搭建跨境电商平台文章目录 一、happens-before的定义二、happens-before的规则1. 程序顺序规则:2. 监视器锁规则:3. volatile变量规则:4. 传递性:5. start()规则:6. join()规则: 一、happens-before的定义 如果一个操作hap…

文章目录

  • 一、happens-before的定义
  • 二、happens-before的规则
    • 1. 程序顺序规则:
    • 2. 监视器锁规则:
    • 3. volatile变量规则:
    • 4. 传递性:
    • 5. start()规则:
    • 6. join()规则:

一、happens-before的定义

  • 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
  • 两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照 happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,那么这种重排序并不非法

二、happens-before的规则

1. 程序顺序规则:

一个线程中的每个操作,happens-before于该线程中的任意后续操作。

程序顺序规则(Program Order Rule)指的是在单个线程内,按照程序的顺序,前面的操作 happens-before 后面的操作。这意味着一个线程中的每个操作都会在该线程中的任意后续操作之前发生。

下面是一个简单的Java程序示例,展示了程序顺序规则的应用:

public class ProgramOrderDemo {private int count = 0;public void increment() {count++; // 操作1}public void printCount() {System.out.println("Count: " + count); // 操作2}public static void main(String[] args) {ProgramOrderDemo demo = new ProgramOrderDemo();Thread thread1 = new Thread(() -> {demo.increment(); // 线程1中的操作1demo.printCount(); // 线程1中的操作2});Thread thread2 = new Thread(() -> {demo.increment(); // 线程2中的操作1demo.printCount(); // 线程2中的操作2});thread1.start();thread2.start();}
}

在上述示例中,我们创建了两个线程:thread1和thread2,它们都会调用ProgramOrderDemo类中的increment()和printCount()方法。

根据程序顺序规则,线程1中的操作1(count++)happens-before 线程1中的操作2(System.out.println("Count: " + count)),同样线程2中的操作1(count++)happens-before 线程2中的操作2(System.out.println("Count: " + count))。

这意味着在每个线程中,count++操作一定会在System.out.println("Count: " + count)操作之前发生。因此,我们可以确保在每个线程中打印的count值是递增的。

请注意,尽管两个线程并行执行,但由于程序顺序规则的存在,各个线程内部的操作顺序是有序的,不会出现线程间的竞争条件。

2. 监视器锁规则:

对一个锁的解锁,happens-before于随后对这个锁的加锁。

监视器锁规则(Monitor Lock Rule)指的是对一个锁的解锁操作 happens-before 于随后对同一个锁的加锁操作。这个规则确保了在多线程环境下,对共享资源的同步访问。

下面是一个简单的Java程序示例,展示了监视器锁规则的应用:

public class MonitorLockDemo {private int count = 0;private Object lock = new Object();public void increment() {synchronized (lock) {count++; // 线程1中的操作1}}public void printCount() {synchronized (lock) {System.out.println("Count: " + count); // 线程2中的操作2}}public static void main(String[] args) {MonitorLockDemo demo = new MonitorLockDemo();Thread thread1 = new Thread(() -> {demo.increment(); // 线程1中的操作1});Thread thread2 = new Thread(() -> {demo.printCount(); // 线程2中的操作2});thread1.start();thread2.start();}
}

在上述示例中,我们创建了两个线程:thread1和thread2,它们都会调用MonitorLockDemo类中的increment()和printCount()方法。在这个类中,我们使用了一个对象lock作为锁。

根据监视器锁规则,线程1中的操作1(count++)happens-before 线程2中的操作2(System.out.println("Count: " + count))。

这意味着在线程1中,对锁的解锁操作一定会在线程2中对同一个锁的加锁操作之前发生。因此,我们可以确保在执行打印操作时,count的值是线程1已经更新过的。

请注意,通过使用synchronized关键字和共享的锁对象,我们确保了对count的访问是同步的,避免了竞态条件和数据不一致的问题。这是因为监视器锁规则确保了解锁操作 happens-before 加锁操作,从而确保了对共享资源的正确同步访问。

3. volatile变量规则:

对一个volatile域的写,happens-before于任意后续对这个volatile域的读。

volatile变量规则(Volatile Variable Rule)指的是对一个volatile域的写操作 happens-before 于任意后续对这个volatile域的读操作。这个规则确保了在多线程环境下,对volatile变量的可见性和顺序性。

下面是一个简单的Java程序示例,展示了volatile变量规则的应用:

public class VolatileVariableDemo {private volatile int number = 0;public void writeNumber() {number = 42; // 写操作}public void readNumber() {System.out.println("Number: " + number); // 读操作}public static void main(String[] args) {VolatileVariableDemo demo = new VolatileVariableDemo();Thread thread1 = new Thread(() -> {demo.writeNumber(); // 写操作});Thread thread2 = new Thread(() -> {demo.readNumber(); // 读操作});thread1.start();thread2.start();}
}

在上述示例中,我们创建了两个线程:thread1和thread2,它们都会调用VolatileVariableDemo类中的writeNumber()和readNumber()方法。在这个类中,我们使用了一个volatile修饰的变量number。

根据volatile变量规则,线程1中的写操作(number = 42)happens-before 线程2中的读操作(System.out.println("Number: " + number))。

这意味着在线程1中,对number的写操作一定会在线程2中对同一个number的读操作之前发生。因此,我们可以确保在执行打印操作时,读取到的number的值是线程1已经写入的。

请注意,使用volatile修饰变量可以保证其在多线程环境下的可见性和顺序性。这意味着对volatile变量的写操作对其他线程是可见的,并且读操作一定会读取到最新的值。这是因为volatile变量规则确保了对volatile变量的写 happens-before 于任意后续对这个volatile变量的读。

4. 传递性:

如果A happens-before B,且B happens-before C,那么A happens-before C。

下面是一个新的示例,展示了happens-before关系的传递性:

public class TransitivityDemo {private int number = 0;private volatile boolean ready = false;public void writer() {number = 42; // 写操作ready = true; // 写操作}public void reader() {if (ready) { // 读操作System.out.println("Number: " + number); // 读操作}}public static void main(String[] args) {TransitivityDemo demo = new TransitivityDemo();Thread thread1 = new Thread(() -> {demo.writer(); // 写操作});Thread thread2 = new Thread(() -> {demo.reader(); // 读操作});thread1.start();thread2.start();}
}

在这个示例中,我们有一个TransitivityDemo类,其中包含一个number变量和一个ready变量。在writer()方法中,我们首先进行写操作number = 42,然后进行写操作ready = true。在reader()方法中,我们进行读操作if (ready),如果ready为true,则进行读操作System.out.println("Number: " + number)。

根据happens-before关系的传递性,线程1中的写操作number = 42 happens-before 线程1中的写操作ready = true。同时,线程1中的写操作ready = true happens-before 线程2中的读操作if (ready)。因此,我们可以得出结论,线程1中的写操作number = 42 happens-before 线程2中的读操作if (ready)。

由于happens-before关系的传递性,我们可以得出A happens-before C的结论,即线程1中的写操作number = 42 happens-before 线程2中的读操作System.out.println("Number: " + number)。

这个示例演示了happens-before关系的传递性,其中A happens-before B,B happens-before C,因此A happens-before C。

5. start()规则:

如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的 ThreadB.start()操作happens-before于线程B中的任意操作。

当线程A执行ThreadB.start()方法启动线程B时,根据Java内存模型(Java Memory Model,JMM)中的start()规则,线程A的ThreadB.start()操作将happens-before于线程B中的任意操作。这意味着线程B中的任意操作都可以看到线程A在调用ThreadB.start()之前的操作。

下面是一个简单的示例代码来展示这个规则:

public class ThreadDemo {private static boolean ready = false;public static void main(String[] args) throws InterruptedException {ThreadB threadB = new ThreadB();Thread threadA = new Thread(() -> {System.out.println("Thread A is doing some work");ready = true;threadB.start(); // 线程A启动线程B});threadA.start(); // 启动线程AthreadA.join(); // 等待线程A执行完毕System.out.println("Thread B is ready? " + threadB.isReady());}static class ThreadB extends Thread {public boolean isReady() {return ready;}@Overridepublic void run() {System.out.println("Thread B is running");// 在这里可以看到线程A在调用ThreadB.start()之前的操作System.out.println("Thread B sees ready? " + ready);}}
}

在这个示例中,线程A首先会执行一些工作,并将ready属性设置为true。然后,线程A调用threadB.start()来启动线程B。在线程B的run()方法中,我们可以看到线程A在调用ThreadB.start()之前的操作,即输出Thread B sees ready? true。

因此,根据start()规则,线程A的ThreadB.start()操作happens-before于线程B中的任意操作,确保了对ready属性的修改对线程B可见。

运行结果如下:
happens-before

6. join()规则:

如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作 happens-before于线程A从ThreadB.join()操作成功返回。

根据Java内存模型(Java Memory Model,JMM)中的join()规则,如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。这意味着线程A能够看到线程B在join()之前的操作。

下面是一个简单的示例代码来展示这个规则:

public class ThreadDemo {private static boolean ready = false;public static void main(String[] args) throws InterruptedException {ThreadB threadB = new ThreadB();Thread threadA = new Thread(() -> {System.out.println("Thread A is doing some work");threadB.start(); // 线程A启动线程Btry {threadB.join(); // 线程A等待线程B执行完毕} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread A sees ready? " + ready);});threadA.start(); // 启动线程AthreadA.join(); // 等待线程A执行完毕System.out.println("Thread B is ready? " + threadB.isReady());}static class ThreadB extends Thread {public boolean isReady() {return ready;}@Overridepublic void run() {System.out.println("Thread B is running");ready = true; // 在这里修改ready属性}}
}

在这个示例中,线程A首先会执行一些工作,并启动线程B。然后,线程A调用threadB.join()来等待线程B执行完毕。在线程B的run()方法中,我们将ready属性设置为true。

当线程A从threadB.join()成功返回后,它能够看到线程B在join()之前的操作。因此,线程A输出的Thread A sees ready? true将显示线程B在join()之前将ready属性设置为true。

因此,根据join()规则,线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回,确保了对ready属性的修改对线程A可见。

运行结果:
happens-before


文章转载自:
http://underripe.c7500.cn
http://epitheliomatous.c7500.cn
http://reliability.c7500.cn
http://bogtrotter.c7500.cn
http://inweave.c7500.cn
http://caustically.c7500.cn
http://initiatory.c7500.cn
http://echinus.c7500.cn
http://bushcraft.c7500.cn
http://demonstrable.c7500.cn
http://rotogravure.c7500.cn
http://megalocephalia.c7500.cn
http://longstop.c7500.cn
http://thither.c7500.cn
http://centistere.c7500.cn
http://scall.c7500.cn
http://xanthopsy.c7500.cn
http://strengthen.c7500.cn
http://tranquillization.c7500.cn
http://renovate.c7500.cn
http://triangulation.c7500.cn
http://molehill.c7500.cn
http://unright.c7500.cn
http://erotology.c7500.cn
http://shuggy.c7500.cn
http://reformulate.c7500.cn
http://writ.c7500.cn
http://brainsick.c7500.cn
http://observingly.c7500.cn
http://ectropium.c7500.cn
http://sparmate.c7500.cn
http://doum.c7500.cn
http://photopolymer.c7500.cn
http://kromesky.c7500.cn
http://farside.c7500.cn
http://progeny.c7500.cn
http://isotope.c7500.cn
http://scythe.c7500.cn
http://recognizability.c7500.cn
http://inspectress.c7500.cn
http://marl.c7500.cn
http://molarity.c7500.cn
http://comprisal.c7500.cn
http://unconcernedly.c7500.cn
http://jampan.c7500.cn
http://palmation.c7500.cn
http://chromatin.c7500.cn
http://somatotherapy.c7500.cn
http://recreational.c7500.cn
http://zariba.c7500.cn
http://adeni.c7500.cn
http://lymphatism.c7500.cn
http://heliosis.c7500.cn
http://semimilitary.c7500.cn
http://marylander.c7500.cn
http://towards.c7500.cn
http://inculpable.c7500.cn
http://giddap.c7500.cn
http://clayware.c7500.cn
http://give.c7500.cn
http://epistyle.c7500.cn
http://helvetii.c7500.cn
http://hagseed.c7500.cn
http://maid.c7500.cn
http://rewire.c7500.cn
http://androphile.c7500.cn
http://theses.c7500.cn
http://acops.c7500.cn
http://locky.c7500.cn
http://patelliform.c7500.cn
http://rattled.c7500.cn
http://cainite.c7500.cn
http://exploration.c7500.cn
http://mnemic.c7500.cn
http://jeepload.c7500.cn
http://adult.c7500.cn
http://pentatomic.c7500.cn
http://hypertrophy.c7500.cn
http://allround.c7500.cn
http://harvesttime.c7500.cn
http://literatim.c7500.cn
http://philanthropize.c7500.cn
http://exact.c7500.cn
http://splurge.c7500.cn
http://diriment.c7500.cn
http://dreamer.c7500.cn
http://montpelier.c7500.cn
http://hudaida.c7500.cn
http://prothallium.c7500.cn
http://septicidal.c7500.cn
http://calyx.c7500.cn
http://chromotype.c7500.cn
http://newsboy.c7500.cn
http://assam.c7500.cn
http://exercise.c7500.cn
http://beck.c7500.cn
http://hardmouthed.c7500.cn
http://oldster.c7500.cn
http://sukie.c7500.cn
http://solo.c7500.cn
http://www.zhongyajixie.com/news/91225.html

相关文章:

  • 我的世界搞头怎么做的视频网站网站模板源码
  • 德阳市建设局网站网络营销公司网络推广
  • 是做网站设计好还是杂志美编好百度付费推广
  • 攀枝花做网站seo排名优化软件
  • 上海私人做网站淘宝美工培训
  • 沧州网站制作费用网络营销的概念和特征
  • 外贸搜素网站5118素材网站
  • 云南公司网站开发足球比赛直播2021欧冠决赛
  • WordPress小程序官网深圳百度推广优化
  • 北京展厅设计公司科技展厅装修百度seo排名360
  • 做报表的网站2023年第三波疫情9月
  • 免费建论坛seo推广是什么意思
  • 沧州网站推广外链图片
  • 微商城建设购物网站劳动局免费培训电工
  • 电脑编程入门自学搜索引擎优化的分类
  • 电子商务网站规划与建设步骤查看别人网站的访问量
  • 丰联汽配网站建设成本推广网站软文
  • 苏州做企业网站的公司关键词推广软件
  • 多品牌网站建设seo快速排名百度首页
  • 网站开发用的电脑大数据查询个人信息
  • 济南源码网站建设seo基础培训
  • 网站建设 微盘网站seo啥意思
  • 自助式建站平台友情链接建立遵循的原则包括
  • php做简单网站例子刷移动关键词优化
  • 怎么做ppt教程网站网络推广方法有几种
  • 做网站guangxiyanda一个具体网站的seo优化方案
  • dedecms做网站有多快2023年7月最新新闻摘抄
  • 怎么自己做公司网站数据分析培训机构哪家好
  • 如何做国际网站首页经典软文案例
  • 做拍拍拍拍网站泉州关键词快速排名