2021-04-12-并发编程三大特性

Ubuntu20.04 + CLion(2021.1) + GCC(11 or 12)搭建C++20开发环境 这里写目录标题简介Ubuntu20.04gcc 12.0.0CLion 简介 Ubuntu20.04 安装新版本Ubuntu系统 下载镜像、刻录工具、开机启动控制(双系统) 注意进入BIOS设置U盘启动,然后断网安装 gcc 12.0.0 CLion 阅读详情

1、可见性(visibility)

volatile保证线程可见性
/**
 * volatile 关键字,使一个变量在多个线程间可见
 * A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道
 * 使用volatile关键字,会让所有线程都会读到变量的修改值
 * <p>
 * 在下面的代码中,running是存在于堆内存的t对象中
 * 当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,并不会每次都去
 * 读取堆内存,这样,当主线程修改running的值之后,t1线程感知不到,所以不会停止运行
 * <p>
 * 使用volatile,将会强制所有线程都去堆内存中读取running的值
 * volatile并不能保证多个线程共同修改running变量时所带来的不一致问题,也就是说volatile不能替代synchronized
 *
 * @author mashibing
 */
package com.mashibing.juc.c_001_01_Visibility;

import com.mashibing.util.SleepHelper;

import java.io.IOException;

public class T01_HelloVolatile {
    private static /*volatile*/ boolean running = true;

    private static void m() {
        System.out.println("m start");
        while (running) {
            System.out.println("hello");
        }
        System.out.println("m end!");
    }
    public static void main(String[] args) throws IOException {
        new Thread(T01_HelloVolatile::m, "t1").start();
        SleepHelper.sleepSeconds(1);
        running = false;
        System.in.read();
    }
}


按块读取

缓存行 64字节 缓存行对齐

不需要强行使用缓存行,使用注解@Contended

package com.mashibing.juc.c_001_02_FalseSharing;


import sun.misc.Contended;
//注意:运行这个小程序的时候,需要加参数:-XX:-RestrictContended
import java.util.concurrent.CountDownLatch;

public class T05_Contended {
    public static long COUNT = 10_0000_0000L;

    //@Contended  //只有1.8起作用 , 保证x位于单独一行中
    private static class T {
        public long x = 0L;
    }

    public static T[] arr = new T[2];

    static {
        arr[0] = new T();
        arr[1] = new T();
    }

    public static void main(String[] args) throws Exception {
        CountDownLatch latch = new CountDownLatch(2);

        Thread t1 = new Thread(() -> {
            for (long i = 0; i < COUNT; i++) {
                arr[0].x = i;
            }

            latch.countDown();
        });

        Thread t2 = new Thread(() -> {
            for (long i = 0; i < COUNT; i++) {
                arr[1].x = i;
            }

            latch.countDown();
        });

        final long start = System.nanoTime();
        t1.start();
        t2.start();
        latch.await();
        System.out.println((System.nanoTime() - start) / 100_0000);
    }
}

设置参数

缓存一致性协议:

比较出名的有mesi

被修改 独享 共享 失效

2、有序性(ordering)

程序验证乱序:

package com.mashibing.juc.c_001_03_Ordering;

/**
 * 本程序跟可见性无关,曾经有同学用单核也发现了这一点
 */

import java.util.concurrent.CountDownLatch;

public class T01_Disorder {
    private static int x = 0, y = 0;
    private static int a = 0, b = 0;

    public static void main(String[] args) throws InterruptedException {

        for (long i = 0; i < Long.MAX_VALUE; i++) {
            x = 0;
            y = 0;
            a = 0;
            b = 0;
            CountDownLatch latch = new CountDownLatch(2);

            Thread one = new Thread(new Runnable() {
                public void run() {
                    a = 1;
                    x = b;

                    latch.countDown();
                }

            });

            Thread other = new Thread(new Runnable() {
                public void run() {
                    b = 1;
                    y = a;

                    latch.countDown();
                }
            });
            one.start();
            other.start();
            latch.await();
            String result = "第" + i + "次 (" + x + "," + y + ")";
            if (x == 0 && y == 0) {
                System.err.println(result);
                break;
            }
        }
    }

}

乱序的原因:cpu为了增加效率,做了优化

乱序的条件:不影响单线程的最终一直性

例子:对象版初始化

3、原子性(atomicity)

 

 

 

Ubuntu 12.04 安装之后的各种问题 题记 前段时间发神经把系统分区表弄坏了,不得已重装系统了。之前也一直想尝试12.04版,毕竟用11.04很有一段时间了,每每看到那些新特性手都有点痒。这次恨下心,装上了12.04,说实话,很多地方反而没有以前那么好用了……有很多东西需要自己重新去配置。最蛋疼的是,很多以前的方法都失效了,比如gedit乱码,我之前blog里写的方法就没用了。周末基本就耗在这上面了,作为ubuntu的fans,我解 阅读详情

相关推荐

深入学习并发编程中的synchronized

可重入性是锁的一个基本要求,是为了解决自己锁死自己的情况,一个类中的同步方法调用另一个同步方法,假如Synchronized 不支持重入,进入 method2 方法时当前线程获得锁method2 方法里面执行 method1 时当前线程又要去尝试获取锁,这时如果不支持重入,它就要等释放,把自己阻塞,导致自己锁死自己。

TA016422的博客 944

多线程面试题——哲学家就餐问题(Java)

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考以下是部分内容截图又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考以下是部分内容截图。

2401_83977357的博客 504

Ubuntu 22.04 上 Python 3.12 的两种高效安装方法对比

本文详细对比了在Ubuntu 22.04上安装Python 3.12的两种主流方法:通过deadsnakes PPA快速安装和从源代码编译深度定制安装。文章分析了各自的优缺点、适用场景,并提供了详细的步骤指南、避坑技巧及安装后的版本管理与优化建议,帮助开发者根据需求选择最高效、安全的安装方案。

m3n5b7v8c9x的博客 1533

清华老师终于把“计算机底层原理“全部总结出来了

切莫死记硬背,小心面试官直接让你出门右拐1000道互联网Java面试题:

2301_76238237的博客 985

Ubuntu12.04下ndnSIM安装

1、NS3开发环境设置 sudo apt-get install gcc g++ python python-dev //C++和python安装,必装 sudo apt-get install mercurial //NS3代码维护使用的源码版本控制管理系统 分布式版本控制系统 sudo apt-get install bzr //运行python绑定ns-3-dev需要bazaar这个组

sunrisehp的专栏 1721

Ubuntu 12.04 LTS种子文件下载指南

Ubuntu 12.04 LTS(代号Precise Pangolin)于2012年4月26日发布,标志着Ubuntu社区进入了一个新的时代。该版本不仅在技术上进行了革新,而且还提供了长达五年的支持,这为用户和企业提供了长期的稳定性和安全性。12.04 LTS作为Ubuntu历史上最为重要的里程碑之一,为随后多个版本的发展奠定了坚实的基础。P2P(Peer-to-Peer)网络技术是一种网络通信模型,它允许网络中的参与者直接共享文件和其他资源,而无需中央服务器的参与。

weixin_42575505的博客 959

计算机底层原理

通过源码我们看到,为何总是唤醒线程A,这是用于当线程C竞争不到锁时,被放入了cxq队列,而此时entrylist为null,线程A在等待集waitset中,当我们调用notify方法时,由于移动策略默认是2,这时会从等待集的头部将线程A取下,放入到entrylist中,当notify执行完毕后,在执行后面的monitor_exit字节码时将会优先从entrylist中唤醒线程,这就导致了A线程总是被优先执行。httpshttpshttpshttpshttpshttpshttpshttps。...

油墨香^-^的博客 1051

前端零代码丨UIOTOS + NodeRed:无代码搭建工控上位机的绝配组合!

用户类型价值硬件产品商软硬一体方案,无代码GUI上位机成新卖点软件服务商售前原型演示利器,交付成本降低至1/3平台开发商融合无代码技术,同质化竞争中脱颖而出🚀 总结UIOTOS的前端零代码设计(页面嵌套、属性继承、节点连线)与NodeRed的后端流程自动化,堪称工控与IoT开发的黄金组合。无论是串口通信、SCADA监控还是业务管理,均能实现“无代码交付”,真正让前端不求人,硬件交互触手可及!探索更多案例:UIOTOS官网在线体验。

2502_91192798的博客 757

线程知识学习三(线程的“打断”)

线程知识学习三(线程的“打断”)interrupt的三个方法 interrupt的三个方法 1、interrupt():打断某个线程(设置线程中断标志位) 2、isInterrupted():查询某个线程是否被打断过(查询中断标志位) 3、static interrupted():查询当前线程是否被打断过,并重置打断标志 public class Interrupt_and_isInterrupted { public static void main(String[] args) {

lsd&xql的博客 717

PX4无人机-Gazebo仿真实现动态目标追踪的视觉控制方案

本文详细介绍了PX4无人机在Gazebo仿真环境中实现动态目标追踪的视觉控制方案。从PX4与Gazebo仿真环境搭建、动态目标追踪核心技术栈、仿真环境深度定制技巧到追踪算法的优化实践,提供了全面的技术指导和常见问题排查方法,帮助开发者高效实现无人机视觉追踪功能。

weixin_29196315的博客 452

思科路由器IPv6各种路由协议配置

思科路由器IPv6路由协议配置:1、静态路由配置;2、默认路由配置;3、RIPng路由配置;4、OSPFv3路由配置。

weixin_41687096的博客 6544

创建线程的六种状态代码示例

RUNNABLE : 可运行状态,由线程调度器可以安排执行。TIMED WAITING: 隔一段时间后自动唤醒。包括READY和RUNNING两种细分状态。NEW : 线程刚刚创建,还没有启动。BLOCKED: 被阻塞,正在等待锁。TERMINATED: 线程结束。WAITING: 等待被唤醒。

m0_70299172的博客 319

Buck-Boost电路

前面我们学习了降压的Buck电路 (左图) 和升压的Boost电路 (右图),那么如果我们把Buck电路和Boost电路结合一下会发生什么情况? 我们尝试着画一下: 我们用Buck电路作为输入,然后用Boost电路进行调整,最后输出。因此Buck电路中的负载、Boost电路的电源都可以删掉。得到下图: 由于Buck电路中的C2的作用是在输出的时候滤波,这个功能已经由Boost电路中的C1实现了,因此可以删除Buck电路中的C2电容。得到下图: 这里两个电感处于串联状态,可以合二为一,得到下面的电路:

wangeil007的博客 4万+

CSS相关知识04——三大特性

CSS有三个非常重要的特性:层叠性、继承性、优先级。

m0_74220769的博客 374

传统(经典)粒子群算法(PSO)解决单目标优化问题

智能算法:粒子群算法(particle swarm optimizer)—PSO %原理:(1)种群初始化–N(种群数)–D(个体数)–x(i)(粒子位置)–v(i)(粒子速度) % (2)计算每个粒子的适应度值–而适应度值需要选择适应度函数 % (3)对于每个粒子,使用它的适应度值fit[i]和个体的极值pbest(i)进行比较,如果fit[i]>pbest(i),则pbest(i)=fit[i] % (4)同理,对每个粒子用它的适应值与全局极值进行比较,如果比它大,则

weixin_51631044的博客 1295

关于红队方面的学习资料

关于红队方面的学习资料

Sumarua的博客 1085

ubuntu24.04与ubuntu22.04比,有什么新特性?

Ubuntu 24.04 LTS 是一次重大的更新,带来了全新的安装体验、更现代的应用中心、最新的 GNOME 桌面、显著的内核和工具链升级,以及多项安全性和性能改进。重新设计的“鼠标与触摸板”设置,改进的“网络”设置(支持更多 VPN 类型和 Wi-Fi 安全协议),以及对可变刷新率 (VRR) 的实验性支持。影响: 新内核带来了更好的硬件支持(特别是最新的 CPU、GPU 和 Wi-Fi 芯片),性能改进,以及新的内核级安全特性。影响: 新的应用中心设计更现代,旨在提供更好的应用发现和管理体验。

u011091936的博客 4450

【数字IC验证进阶】正则表达式(Regular Expression)快速入门指南

在芯片开发过程中,正则表达式的使用非常常见。初次上手晦涩难懂,多用几次爱不释手!

悟已往之不谏 知来者之可追 1441

Ubuntu 12.04 LTS各版本下载地址汇总

2012年4月26日,Ubuntu 12.04 LTS正式发布,本次代号为Precise Pangolin(一丝不苟的穿山甲),新增最大一个特性就是传说要取代传统菜单的HUD。以下是本次的下载地址汇总。   2012年4月26日,Ubuntu 12.04 LTS正式发布,本次代号为Precise Pangolin(一丝不苟的穿山甲),新增最大一个特性就是传说要取代传统菜单的HU

718

铁路场景雷达点云目标识别与追踪系统

本文介绍了一种基于毫米波雷达的铁路货运车站安全监控系统。该系统采用分布式架构,通过多个毫米波雷达节点采集点云数据,经过坐标转换、多雷达融合等处理后,利用机器学习算法实现列车、行人等目标的实时识别与追踪。系统包含数据采集层、处理层、目标识别层、追踪层、预警决策层和可视化层,能够克服传统视频监控受环境影响大的缺点,实现全天候可靠监测。文中详细展示了雷达数据解析和点云预处理的代码实现,包括坐标转换、数据格式解析和体素网格滤波等关键技术。该系统可有效预警铁路场景下的碰撞风险,提升货运车站的安全管理水平。

huanghm88的专栏 125

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

如何通过PPA安装/升级gcc和g++版本到4.8.1 (Ubuntu 12.04, 13.04, 10.04适用)

gcc 4.8.1 是第一个完全支持C++11 的编译器。下文是如何在Ubuntu 12.04, Ubuntu 13.04 或 Ubuntu 12.10中通过PPA安装GCC 4.8的步骤。PPA为Ubuntu用户提供了GCC 4.7.3 和 GCC 4.8.1两个版本。在Ubuntu12.04 LTS默认安装的是gcc4.6.3,该版本只支持部分c++11的特性,可以通过增加“-std=c++0x" 编译选项来使用这些特性,但是对多线程库的支持较差。你可以参考下文的步骤,来升级系统中的gcc,g++版本。

每天进步一点 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Ubuntu12.04升级至13.04

我是个爱玩的孩子,而且我喜欢新鲜的玩意,用了一年的Ubuntu 12.04 ,还是有点感情的,4.25号我第一时间下载了Ubuntu13.04镜像,但是一直不舍得下手升级……       就在今天上午,我终于狠下心来,升级了我的Ubuntu12.04 传说中的五年长期维护版!!!不过话说回来……我使用的办法还是很恶心的,需要先从12.04升级到12.10,再从12.10升级到13.04! 让

流浪的虾壳 1645

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

UBUNTU12.04系统特性

Ubuntu Server 12.04 的新特性一览表 中文科技资讯: Ubuntu 12.04 (代号为 Precise Pangolin) 版本主要侧重于发布、稳定性和质量。Ubuntu 12.04 包含最新的代号为 Essex 的 OpenStack 版本,以及一项名为 MAAS 的新特性。此外,可使用 Juju 轻松的部署集中式的 CharmStor...

weixin_33853827的博客 300

并发编程

内核级线程:操作系统级别的线程,存在于操作系统中,由操作系统调度器去调度,它具有一个用户栈,一个内核栈,分别保存在用户空间和内核空间,在内核中有一个用来记录操作系统中所有线程的线程表TCB,当某个线程希望创建一个新线程或撤销一个已有线程时,它进行一个系统调用,这个系统调用通过对线程表的更新完成线程的创建或撤销工作。用户级线程:把整个线程实现部分放在用户空间中,内核对线程一无所知,内核看到的就是一个单线程进程而已,它只有一个用户栈。程序运行在内核空间时就是内核态,运行在用户空间时就是用户态。

flash的博客 575

Ubuntu 12.04配置指南

一、系统设置工具   Myunity   sudo apt-get install myunity   相关文章@Unity 设置工具:MyUnity   Ubuntu tweak   已经发布 0.7.0 正式版本,详情请阅读@IMTX.me   Confity:http://sourceforge.net/projects/confity/   Uni

landishu的专栏 1594

ubuntu+12.04+linux+版本,Ubuntu 12.04新版本为何值得期盼?

现在,Ubuntu 12.04测试版发布已经过去几周了,对其应该有个说法了。这个版本为何值得我们期盼?有何根据?说句实话,此刻(以及在每天的凌晨),我都要面对Ubuntu 11.10桌面开始每日的写作,其墙纸如下:在这张墙纸上,有条小路伸向远方,很有意境(境界或情调)。这上面没有存在的“开始按钮”,只要点击屏幕左侧”启动栏”(Launcher)里面的相关选项即可开始工作。当然,这些选项(即“全息按...

weixin_42523389的博客 256
上一篇: 2021_04_12_优雅结束线程
下一篇: 2021-04-13-常用线程池体系
心系代码
博客等级 码龄9年 60粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心系代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值