volatile

embedded/2025/2/1 1:51:59/

文章目录

    • 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/embedded/158505.html

相关文章

数据结构选讲 (更新中)

参考 smWCDay7 数据结构选讲2 by yyc 。 可能会补充的&#xff1a; AT_cf17_final_j TreeMST 的 F2 Boruvka算法 目录 AT_cf17_final_j Tree MSTP5280 [ZJOI2019] 线段树 AT_cf17_final_j Tree MST link 题意 给定一棵 n n n 个点的树&#xff0c;点有点权 w i w_i wi​&am…

GRAPHARG——学习

20250106 项目git地址&#xff1a;https://github.com/microsoft/graphrag.git 版本&#xff1a;1.2.0 ### This config file contains required core defaults that must be set, along with a handful of common optional settings. ### For a full list of available setti…

算法设计-插入排序(C++)

一、算法原理 插入排序是一种简单直观的排序算法&#xff0c;它的工作原理是将未排序数据插入到已排序序列的合适位置。具体来说&#xff0c;插入排序将数组分为已排序和未排序两部分&#xff0c;初始时已排序部分只有数组的第一个元素&#xff0c;然后依次从未排序部分取出元…

APT (Advanced Package Tool) 安装与使用-linux014

APT (Advanced Package Tool) APT (Advanced Package Tool) 是一个用于管理 Debian 和 Ubuntu 系列 Linux 发行版上的软件包的工具。它简化了软件的安装、升级、配置和删除过程。APT 为用户提供了一个统一的命令行接口&#xff0c;使得管理和安装软件变得更加简单。 APT 主要…

微信阅读网站小程序的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

解决MacOS安装软件时提示“打不开xxx软件,因为Apple无法检查其是否包含恶意软件”的问题

macOS 系统中如何开启“任何来源”以解决安装报错问题&#xff1f; 大家好&#xff01;今天我们来聊聊在使用 macOS 系统 时&#xff0c;遇到安装应用软件时出现报错的情况。这种情况常常发生在安装一些来自第三方开发者的应用时&#xff0c;因为 macOS 会默认阻止不明开发者的…

蓝桥杯准备 【入门2】分支结构

P5709 【深基2.习6】Apples Prologue / 苹果和虫子 题目描述 小 B 喜欢吃苹果。她现在有 mm&#xff08;1≤m≤100&#xff09;个苹果&#xff0c;吃完一个苹果需要花费 tt&#xff08;0≤t≤100&#xff09;分钟&#xff0c;吃完一个后立刻开始吃下一个。现在时间过去了 ss&a…

Python | Pytorch | Tensor知识点总结

如是我闻&#xff1a; Tensor 是我们接触Pytorch了解到的第一个概念&#xff0c;这里是一个关于 PyTorch Tensor 主题的知识点总结&#xff0c;涵盖了 Tensor 的基本概念、创建方式、运算操作、梯度计算和 GPU 加速等内容。 1. Tensor 基本概念 Tensor 是 PyTorch 的核心数据结…