atomic

#Volatile关键字

旧城冷巷雨未停 提交于 2020-10-22 18:31:17
前言 不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能。 缓存可见性 , 指令有序性, 不保证原子性 内存可见性 由于 Java 内存模型( JMM )规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。 线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中。 这里所提到的主内存可以简单认为是 堆内存 ,而工作内存则可以认为是 栈内存 。 所以在并发运行时可能会出现线程 B 所读取到的数据是线程 A 更新之前的数据。显然这肯定是会出问题的,因此 volatile 的作用出现了: 当一个变量被 volatile 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据。 volatile 修饰之后并不是让线程直接从主内存中获取数据,依然需要将变量拷贝到工作内存中 。 1. 可见性问题来源 package com.spring.master.demo.volatiles; /** * @author Huan Lee * @version 1.0 * @date 2020-10-10 15:48 * @describtion 业精于勤

聊聊kingbus的binlog_progress.go

对着背影说爱祢 提交于 2020-10-22 14:16:24
序 本文主要研究一下kingbus的binlog_progress.go BinlogProgress kingbus/server/binlog_progress.go //BinlogProgress is the progress of receiving binlog type BinlogProgress struct { currentGtid *atomic.String lastSaveGtid string //for heartbeat event lastBinlogFile *atomic.String lastFilePosition *atomic.Uint32 executedGtidSetStr *atomic.String trxBoundaryParser *mysql.TransactionBoundaryParser persistentTime time.Time persistentAppliedIndex uint64 executedGtidSet gomysql.GTIDSet store storage.Storage } BinlogProgress定义了currentGtid、lastSaveGtid、lastBinlogFile、lastFilePosition、executedGtidSetStr

深入Java volatile关键字

跟風遠走 提交于 2020-10-17 07:26:30
一、高速缓存cache和缓存一致性协议 在阅读本文之前,需要先了解cache的基本原理和缓存一致性协议,可以参考以下文章: [1] Memory Barriers: a Hardware View for Software Hackers (翻译版: https://juejin.im/post/5ea7e1e6f265da7b9f07a628 ) [2] Cache coherency primer 上述两篇文章给出了一致性缓存设计过程中的一些通用的技术和细节,例如 MESI协议,Store Buffer,Store Forwarding,Invalidation Queue,重排序和内存屏障 等概念,需要对这些概念有所理解。 实际处理器的cache系统,比上述文章中介绍的还要复杂的多,在细节上也可能有所不同(例如何时对store buffer进行刷新操作),不过基本思想都是差不多的。可以通过wikichip网站来查看常见处理器的架构,例如下面这个链接就是英特尔Skylake处理器架构处理器的基本架构: https://en.wikichip.org/wiki/intel/microarchitectures/skylake_(client) 。 英特尔处理器使用基于MESI改进得到的 MESIF一致性协议 ,关于该协议,英特尔并没有给出详细的文档

京东三面问到java多线程问题,我慌了

久未见 提交于 2020-10-16 18:25:10
1. 并行和并发有什么区别? 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。 所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。 2. 线程和进程的区别? 简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。 3. 守护线程是什么? 守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。 4. 创建线程有哪几种方式? ①. 继承Thread类创建线程类 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 创建Thread子类的实例,即创建了线程对象。 调用线程对象的start()方法来启动该线程。 ②. 通过Runnable接口创建线程类 定义runnable接口的实现类,并重写该接口的run()方法,该run

C++语法学习笔记五十二:std atomic续谈、std async深入谈

微笑、不失礼 提交于 2020-10-16 02:14:34
实例代码: // project4.cpp: 定义控制台应用程序的入口点。 // # include <iostream> # include <vector> # include <map> # include <string> # include <thread> # include <list> # include <mutex> # include <future> using namespace std ; //std::atomic<int> g_mycout = 0; //这是个原子整型类型变量;可以向使用整型变量一样使用 //void mythread() //{ // for (int i = 0; i < 10000000; i++) // { // g_mycout++; //对应的操作就是原子操作,不会被打断; // g_mycout += 1; // //g_mycout = g_mycout + 1; //结果不对 // // } // return; //} int mythread ( ) { cout << "mythread() start" << " threadid = " << std :: this_thread :: get_id ( ) << endl ; std :: chrono :: milliseconds dura (

java安全编码指南之:可见性和原子性

邮差的信 提交于 2020-10-11 00:28:43
简介 java类中会定义很多变量,有类变量也有实例变量,这些变量在访问的过程中,会遇到一些可见性和原子性的问题。这里我们来详细了解一下怎么避免这些问题。 不可变对象的可见性 不可变对象就是初始化之后不能够被修改的对象,那么是不是类中引入了不可变对象,所有对不可变对象的修改都立马对所有线程可见呢? 实际上,不可变对象只能保证在多线程环境中,对象使用的安全性,并不能够保证对象的可见性。 先来讨论一下可变性,我们考虑下面的一个例子: public final class ImmutableObject { private final int age; public ImmutableObject ( int age) { this .age=age; } } 我们定义了一个ImmutableObject对象,class是final的,并且里面的唯一字段也是final的。所以这个ImmutableObject初始化之后就不能够改变。 然后我们定义一个类来get和set这个ImmutableObject: public class ObjectWithNothing { private ImmutableObject refObject; public ImmutableObject getImmutableObject () { return refObject; } public

聊聊kingbus的main.go

為{幸葍}努か 提交于 2020-10-10 01:58:06
序 本文主要研究一下kingbus的main.go main.go kingbus/cmd/kingbus/main.go package main import ( "flag" "fmt" "os" "os/signal" "syscall" "github.com/flike/kingbus/config" "github.com/flike/kingbus/log" "github.com/flike/kingbus/server" ) var ( //BuildDate used for generating build date in make command BuildDate string //BuildVersion used for generating kingbus version in make command BuildVersion string ) const banner string = ` __ _ __ / /__(_)___ ____ _/ /_ __ _______ / //_/ / __ \/ __ '/ __ \/ / / / ___/ / ,< / / / / / /_/ / /_/ / /_/ (__ ) /_/|_/_/_/ /_/\__, /_.___/\__,_/____/ /____/ ` func main() {

The complete list of new features in MySQL 8.0

故事扮演 提交于 2020-10-04 06:05:13
截止目前最完整的MySQL 8.0新特性列表。 原文出处:https://mysqlserverteam.com/the-complete-list-of-new-features-in-mysql-8-0/ There are over 300 new features in MySQL 8.0. The MySQL Manual is very good, but verbose. This is a list of new features in short bullet form. We have tried very hard to make sure each feature is only mentioned once. Note the similar list for MySQL 5.7. Please download MySQL 8.0 from dev.mysql.com or from the MySQL Yum, APT, or SUSE repositories. SQL DML Non-recursive CTEs [1] Recursive CTEs [1] Window functions [1] ORDER BY and DISTINCT with ROLLUP [1] LATERAL derived tables [1] Outer

Java线程安全解决方案(synchronized,ReentrantLock,Atomic使用场景描述)

六眼飞鱼酱① 提交于 2020-10-02 06:20:49
线程安全解决方案 synchronized,ReentrantLock,Atomic 使用场景描述 在实际开发过程中如果服务量,请求频繁,就会经常碰见并发,这时候不做处理就会出现很多非法数据。这时候就需要解决线程安全的问题,这时候就可以使用java当中的锁机制。常用有java关键 synchronized 、可重入锁 ReentrantLock ,还有并发包下的 Atomic 或者 Concurrent 的安全类型。 synchronized使用场景: 在资源竞争不是很激烈的情况下,偶尔出现并发,需要同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化synchronized,另外可读性非常好,不管用没用过5.0多线程包的程序员都能理解。可以多对方法进行加锁(同步方法),也可以对对象进行加锁(同步代码快)。 /** * synchronized用id */ private static volatile Long syncId = 0 L ; /** * synchronized方式获取id 同步方法 * @return */ public static synchronized Long getSyncId1 ( ) { syncId ++ ; return syncId ; } /** * synchronized方式获取id 同步代码块