volatile

server/2025/2/1 1:20:24/

文章目录

    • ResortSeqDemo.java
    • SingletonDemo.java
    • SingletonDemo2.java
    • VolatileDemo.java

ResortSeqDemo.java

package com.xd.thread;public class ResortSeqDemo {volatile int a=0;boolean flag=false;/*多线程下flag=true可能先执行,还没走到a=1就被挂起其他线程进入method02的判断,修改a的值=5,而不是6*/public void method01(){a=1;flag=true;}public void method02(){if (flag){a+=5;System.out.println("******最终值a:"+a);}}public static void main(String[] args) {ResortSeqDemo resortSeq = new ResortSeqDemo();new Thread(()->{resortSeq.method01();},"ThreadA").start();new Thread(()->{resortSeq.method02();},"ThreadB").start();}}

SingletonDemo.java

package com.xd.thread;/*** 单例模式 DCL 双端检查锁* 当前类的对象必须本类创建,构造方法私有,本类中对外一个公共可以访问的方法返回该对象*/class Singleton1{private static Singleton1 instance = null;private Singleton1() {System.out.println(Thread.currentThread().getName() + "\t Singleton1构造方法执行了");}public static Singleton1 getInstance(){if (instance == null) {instance = new Singleton1();}return instance;}}public class SingletonDemo {public static void main(String[] args) {//main线程操作
//        System.out.println(Singleton.getInstance() == Singleton.getInstance());
//        System.out.println(Singleton.getInstance() == Singleton.getInstance());
//        System.out.println(Singleton.getInstance() == Singleton.getInstance());for (int i = 0; i < 10; i++) {new Thread(()->{Singleton1.getInstance();},String.valueOf(i)).start();}}}

SingletonDemo2.java

package com.xd.thread;/*** 单例模式 DCL 双端检查锁* 当前类的对象必须本类创建,构造方法私有,本类中对外一个公共可以访问的方法返回该对象*/class Singleton2{private volatile static Singleton2 instance = null;private Singleton2() {System.out.println(Thread.currentThread().getName() + "\t Singleton2构造方法执行了");}public static Singleton2 getInstance(){if(instance == null){synchronized (Singleton2.class){if (instance == null) {instance = new Singleton2();}}}return instance;}}public class SingletonDemo2 {public static void main(String[] args) {//main线程操作
//        System.out.println(Singleton.getInstance() == Singleton.getInstance());
//        System.out.println(Singleton.getInstance() == Singleton.getInstance());
//        System.out.println(Singleton.getInstance() == Singleton.getInstance());for (int i = 0; i < 10; i++) {new Thread(()->{Singleton2.getInstance();},String.valueOf(i)).start();}}}

VolatileDemo.java

package com.xd.thread;import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;class MyData {volatile int number = 0;//volatile int number = 0;AtomicInteger atomicInteger = new AtomicInteger();public void setNumber(){this.number = 60;}public void  addPlusPlus(){number++;}public void atomicPlusPlis(){atomicInteger.getAndIncrement();//i++}}public class VolatileDemo {public static void main(String[] args) {/*** 创建20个线程,每个线程执行1000次 number++操作,最后打印 number的结果值*/System.out.println("原子性操作...");MyData myData = new MyData();//创建20个线程,每个线程执行1000次for (int i = 1; i <= 20; i++) {new Thread(()->{for (int j = 0; j < 1000; j++) {myData.addPlusPlus();myData.atomicPlusPlis();}}, String.valueOf(i)).start();}//20个线程都执行完毕后,打印number值while (Thread.activeCount() > 2){ // mian,gcThread.yield();}System.out.println(Thread.currentThread().getName()+"\t int类型的最终的number值====" + myData.number);System.out.println(Thread.currentThread().getName()+"\t atomicInteger类型的最终的number值====" + myData.atomicInteger);}/*** 可见性演示*/private static void method01() {System.out.println("可见性的演示。。。");MyData myData = new MyData();// 新创建的线程new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t 执行。。。");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}myData.setNumber();},"ThreadA").start();// main线程while (myData.number == 0){//main线程 访问的number变量,一直为0System.out.println("main。。。");}System.out.println(Thread.currentThread().getName()+"\t main线程获取到了"+ myData.number);}}

http://www.ppmy.cn/server/163929.html

相关文章

Redis内部数据结构--跳表详解

跳表 1. 什么是跳表--skiplist2. skiplist的效率如何保证3. 跳表的实现4. 跳表与平衡搜索树和哈希表的对比 1. 什么是跳表–skiplist skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是一样的&#xff0c;可以作为…

我的毕设之路:(2)系统类型的论文写法

一般先进行毕设的设计与实现&#xff0c;再在现成毕设基础上进行描述形成文档&#xff0c;那么论文也就成形了。 1 需求分析&#xff1a;毕业设计根据开题报告和要求进行需求分析和功能确定&#xff0c;区分贴合主题的主要功能和拓展功能能&#xff0c;删除偏离无关紧要的功能…

一文讲解JVM中的G1垃圾收集器

接上一篇博文&#xff0c;这篇博文讲下JVM中的G1垃圾收集器 G1在JDK1.7时引入&#xff0c;在JDK9时取代了CMS成为默认的垃圾收集器&#xff1b; G1把Java堆划分为多个大小相等的独立区域Region&#xff0c;每个区域都可以扮演新生代&#xff08;Eden和Survivor&#xff09;或老…

mysql_store_result的概念和使用案例

mysql_store_result() 是 MySQL C API 中的一个函数&#xff0c;用于检索一个完整的结果集到一个客户端。当执行一个查询&#xff08;通常是 SELECT 查询&#xff09;并希望处理所有返回的数据时&#xff0c;可以使用此函数。 概念 mysql_store_result() 函数的原型如下&…

UE求职Demo开发日志#14 把特效换成通过GC应用,同时完善每段的特效,增加显示物品信息的UI

1 把之前的特效在GC里实现 在DefaultGame.ini里添加这个指定查找路径&#xff1a; [/Script/GameplayAbilities.AbilitySystemGlobals] GameplayCueNotifyPaths"/Game/GAS/GC" 添加标签&#xff1a; 在路径下创建一个GC蓝图&#xff0c;并设置好标签&#xff1a; 重…

01-时间与管理

时间与效率 一丶番茄时钟步骤好处 二丶86400s的财富利用时间的方法每天坚持写下一天计划 自我管理体系计划-行动-评价-回顾 一丶番茄时钟 一个计时器 一份任务清单,任务 步骤 每一个25分钟是一个番茄时钟 将工作时间划分为若干个25分钟的工作单元期间只专注于当前任务,遇到…

SpringBoot Web开发(SpringMVC)

SpringBoot Web开发&#xff08;SpringMVC) MVC 核心组件和调用流程 Spring MVC与许多其他Web框架一样&#xff0c;是围绕前端控制器模式设计的&#xff0c;其中中央 Servlet DispatcherServlet 做整体请求处理调度&#xff01; . 除了DispatcherServletSpringMVC还会提供其他…

Node.js 全局对象

Node.js 全局对象 引言 在Node.js中,全局对象是JavaScript环境中的一部分,它提供了对Node.js运行时环境的访问。全局对象在Node.js中扮演着重要的角色,它使得开发者能够访问和操作Node.js的许多核心功能。本文将详细介绍Node.js的全局对象,包括其特点、常用方法和应用场景…