Synchronized 、Atomic 对比 -- JAVA 进阶

并发编程之ThreadLocal、Volatile、Synchronized、Atomic关键字 前言 工作中用到ThreadLocal、Volatile、Synchronized、Atomic这四个关键字,是时候对它们总结一波了。 共享对象 使用Java编写线程安全的程序关键在于正确的使用共享对象,以及安全的对其进行访问管理。Java的内置锁可以保障线程安全,对于其他的应用来说并发的安全性是使用内置锁保障了线程变量使用的边界。谈到线程的边界问题,随之而来的是Java内存模型另外的一... 阅读详情

在学习CAS无锁时候,总是难免拿来与Synchronized进行比较。
首先先来说一下无锁算法的基本思想:
要实现无锁(lock-free)的非阻塞算法有多种实现方法,其中 CAS(比较与交换,Compare and swap) 是一种有名的无锁算法。CAS, CPU指令,在大多数处理器架构,包括IA32、Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项 乐观锁 技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
这里讲一个JVM当中的CAS应用:

JVM对CAS的支持:AtomicInt, AtomicLong.incrementAndGet()
    具体事例(下面会用到):
     /**
      * Atomically increments by one the current value.
      *
      * @return the updated value
      */
     public final long incrementAndGet() {
         for (;;) {
             long current = get();
             long next = current + 1;
             if (compareAndSet(current, next))
                 return next;
         }
     }

为了比较其与Synchronized关键字的性能比较,我在这里做了一个测试,测试结果:
这里写图片描述

通过以上对比可以明显的发现,使用Atomic的性能要优于Synchronized
具体的代码实现:首先,设计一个类,用于记录运行的时间:

package com.test;

public class StopWatch {
    private long starttime =0;
    private long stoptime =0;
    private boolean running =false;
    public void start() {
        // TODO Auto-generated method stub
        this.starttime = System.currentTimeMillis();
        this.running = true;
    }
    public void stop() {
        // TODO Auto-generated method stub
        this.stoptime = System.currentTimeMillis();
        this.running = false;
    }
    public long getRunningTime() {
        // TODO Auto-generated method stub
        long runningTime;
        if(running){
            runningTime = System.currentTimeMillis()-starttime;
        }else{
            runningTime = stoptime-starttime;
        }
        return runningTime;
    }
    public long getRunningTimeSec() {
        // TODO Auto-generated method stub
        long runningTimeSec;
        if(running){
            runningTimeSec = (System.currentTimeMillis()-starttime)/1000;
        }else{
            runningTimeSec = (stoptime-starttime)/1000;
        }
        return runningTimeSec;
    }

}

接着是测试类的内容:

package com.test;

import java.util.concurrent.atomic.AtomicLong;

public class SyncAtomicTest {
    public static void main(String[] args) {
        System.out.println("------START !------");
        calc();  //不加任何绑定
        calcSyn();   //单线程Synchronized关键字
        calcAtomic();   //单线程Atomic关键字
        testThreadsSync();   //多线程Synchronized关键字
        testThreadAtomic();  //多线程Synchronized关键字
        testThreadsSync();  
        testThreadAtomic();
        System.out.println("------FINISHED !------");
    }
    private static void calc() {
        // TODO Auto-generated method stub
        StopWatch sw = new StopWatch();
        sw.start();
        long var =0;
        while(var<10000000L){
            var++;  
        }
        long runningTime = sw.getRunningTime();
        System.out.println("calc runningTime: "+runningTime);
    }
    private static void calcSyn() {
        // TODO Auto-generated method stub
        StopWatch sw = new StopWatch();
        sw.start();
        long var =0;
        while(var<10000000L){
            synchronized (SyncAtomicTest.class) {
                var++;  
            }
        }
        long runningTime = sw.getRunningTime();
        System.out.println("calcSyn runningTime: "+runningTime);
    }
    private static void calcAtomic() {
        // TODO Auto-generated method stub
        StopWatch sw = new StopWatch();
        sw.start();
        AtomicLong var =new AtomicLong(0);
        while(var.incrementAndGet()<10000000L){
        }
        long runningTime = sw.getRunningTime();
        System.out.println("calcAtomic runningTime: "+runningTime);
    }

    private static void testThreadsSync() {
        // TODO Auto-generated method stub
        StopWatch sw = new StopWatch();
        sw.start();
        Thread t1 = new Thread(new LoopSync());
        t1.start();
        Thread t2 = new Thread(new LoopSync());
        t2.start();
        while(t1.isAlive()||t2.isAlive()){

        }
        sw.stop();
        long runningTime = sw.getRunningTime();
        System.out.println("thread sync runningTime :"+ runningTime);
    }
    private static class LoopSync implements Runnable{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            long var =0;
            while(var <10000000L){
                synchronized (SyncAtomicTest.class) {
                    var++;
                }
            }
        }
    }
    private static void testThreadAtomic() {
        // TODO Auto-generated method stub
        StopWatch sw = new StopWatch();
        sw.start();
        Thread t1 = new Thread(new LoopAtomic());
        t1.start();
        Thread t2 = new Thread(new LoopAtomic());
        t2.start();
        while(t1.isAlive()||t2.isAlive()){}
        sw.stop();
        long runningTime = sw.getRunningTime();
        System.out.println("thread atomic runningTime :"+ runningTime);

    }
    private static class LoopAtomic implements Runnable{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            AtomicLong var =new AtomicLong(0);
            while(var.incrementAndGet() <10000000L){
            }
        }
    }
}

SAP 零售 FMS 物料主数据(一) SAP 零售 FMS 物料主数据(一) SAP 对于鞋服行业最新的解决方案-FMS(相当于原来的AFS+Retail);更偏向与零售; 商品主数据与原来的AFS大不相同,取消了原来的Grid的网格概念,取而代之的是变式;商品主数据维护也偏向于Retail的维护模式;事物代码也不是MM01而是MM41 /MM46; 在维护商品主数据前,需要与商品部沟通定义各种商品相关的规范如编码规则,大中小类 ,颜色库,尺码库等,此处不赘述; 创建商品需要确定哪些物料是变式物料,哪些是常规不带特性的单一物料;这决定了在创建商 阅读详情

相关推荐

机器人空间平滑过渡-6点5次贝塞尔曲线

在工业机器人应用中,空间直线或者圆弧等笛卡尔运动中常使用贝塞尔曲线作为过渡平滑, 而6个控制点5次贝塞尔曲线更具备轨迹平滑、速度可导、加速度连续等要求,往往应用于 高级的机器人控制系统中。 贝塞尔曲线(Bézier curve)定义: 五次贝塞尔曲线公式为 化简得到 从上述式子来看,跟五次多项式是一致的,因此跟5次多项式轨迹规划也有相似之处。 但也存在不一致的地方。若使用...

4326

synchronized和AtomicXXX效率比较

在Java中,i++和++i都是xian线程不安全的,如果要用十个线程累加一个资源,就会出现错误。synchronized和Atomic是实现线程安全常用方法。而二者效率问题孰优孰劣? 本着规律符合任意情况原则,简单写了一个测试代码: public class AtomicTest { int count = 0; AtomicInteger count1 = new Atomic...

地球上的葱~ 1336

PCIE配置和地址空间

来源:https://www.jianshu.com/p/574e9a2cbc4e 每个PCIe设备,有这么一段空间,Host软件可以读取它获得该设备的一些信息,也可以通过它来配置该设备,这段空间就叫做PCIe的配置空间。不同于每个设备的其它空间,PCIe设备的配置空间是协议规定好的,哪个地方放什么内容,都是有定义的。PCI或者PCI-X时代就有配置空间的概念,那时的配置空间如下: 图6.1 整个配置空间就是一系列寄存器的集合,其中Type 0是Endpoint的配置,Type 1是Brid.

qq_28643619的博客 4059

【Java中写一个程序证明AtomicInteger类比synchronized更高效】

【代码】【Java中写一个程序证明AtomicInteger类比synchronized更高效】

相关项目可以查看https://gitee.com/fan-pl或https://github.com/fpl1116 192

冰河木马实验(V8.4)

简述: 百科词条 冰河木马开发于1999年,跟灰鸽子类似,在设计之初,开发者的本意是编写一个功能强大的远程控制软件。但一经推出,就依靠其强大的功能成为了黑客们发动入侵的工具,并结束了国外木马一统天下的局面,跟后来的灰鸽子等等成为国产木马的标志和代名词。 冰河的服务器端程序为G-server.exe,客户端程序为G-client.exe,默认连接端口为7626。其中攻击者使用G-client.e...

野原新之助 1万+

【杰理AC696X】ADKEY复用指示灯不定时出现灯不亮或按键失灵的问题

测试SDK版本:《ac696n_soundbox_sdk_v1.5.0-20211217》ADKEY复用指示灯的做法多用于蓝牙小音箱,IC引脚越来越少,复用也就用的越多了,不过,在使用前应评估好功能,因为复用的做法,肯定会牺牲点东西的,如果体验感啥的。 比如这个图,(V-)按键按下时,LED是会一直导通发光的,按不同阻值的按键还有亮度不一致的问题,这样的问题有的客户是不接受的,这就要另寻他法了。某天调好案子,放在一边测试时,发现指示灯不亮了,按键也不起作用,想起之前AC692系列也有类似的问题,很快就定位到

xx842678的博客 1654

Java并发基础:原子类之AtomicBoolean全面解析

AtomicBoolean类优点在于能够确保布尔值在多线程环境下的原子性操作,避免了繁琐的同步措施,它提供了高效的非阻塞算法实现,可以大大提成程序的并发性能,AtomicBoolean的API设计非常简单易用。

科技互联网领域深度探索者,乐于分享与写作。 5183

ArcGIS供地图斑图形及属性入库操作(附练习数据)

已知数据: 供地图斑位置图。 供地图斑表格 成果要求:将供地图斑导入mdb数据库并将供地图斑表格的属性进行挂接。 接下来我们开始操作: 1、 打开arcmap,在目录内连接的文件夹内找到供地图斑位置图。图片 2、 将annotation和polygon添加到arcmap图片 3、 右击文件所在文件夹新建mdb数据库图片 4、 右击数据库新建要素数据集。(要素数据集非常重要,稍后所有操作都在数据集内进行)选择图斑投影方式及代号。图片 5、 右击要素数据集—导入(将图层内的数据导入数据库)图片 6、 数据导入.

qq_43173805的博客 8130

各种同步方法性能比较(synchronized,ReentrantLock,Atomic)

5.0的多线程任务包对于同步的性能方面有了很大的改进,在原有synchronized关键字的基础上,又增加了ReentrantLock,以及各种Atomic类。了解其性能的优劣程度,有助与我们在特定的情形下做出正确的选择。 总体的结论先摆出来: synchronized: 在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的。原因在于,编译程序...

公众号:Tunky的实用主义 610

【数字孪生工业应用实战】第2篇:数字孪生系统架构设计与技术选型——从“作秀”到“实干”的骨架构建

本文系统剖析了数字孪生系统从“作秀”到“实干”的架构设计关键。针对多数项目在POC转生产时因架构混乱、选型盲目而失败的问题,深入阐述了四层分层架构(感知层、传输层、模型层、应用层)的设计原则,重点解析了感知层的异构适配与边缘预处理、传输层的异步解耦与多模式通信等工程细节。结合OPC UA、MQTT、EdgeX Foundry等主流技术选型对比,以及汽车焊装车间边缘智能网关的实战代码,提供了从零搭建微型孪生系统的完整指导。旨在帮助工程师建立清晰的选型决策逻辑,构建稳定、可演进的数字孪生“骨架”。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 264

Android功耗系列专题理论之十三:MTK平台待机功耗问题分析方法

摘要:本文详细分析了MTK平台待机功耗问题的调试方法,重点介绍了SPM电源管理机制、26M时钟控制逻辑以及系统深睡眠状态的判断标准。文章提供了完整的Debug流程,包括日志抓取、唤醒源分析、SCP睡眠状态检查以及时钟/LDO状态排查等实用技巧,并给出硬件漏电点和软件配置异常的排查方案。针对不同模块(Modem/Conn/SSPM等)提供了具体的电源管理绕过命令,适用于功耗问题调试和低功耗模式验证场景。

559

使用Synchronized和Atomic控制并发对比

按照我们往常的经验,我们看到多线程就可能习惯性地将Synchonized往上怼,Synchronized中使用了悲观锁思想,它是可重入锁,实现了多线程的原子性、可见性保证了线程安全,但是有些场景下使用Atomic原子类往往会取得更好的效果,因为Atomic原子类使用的是CAS无锁机制,更加高效地帮助我们实现多线程并发工作,下面是两个代码对比,看到执行结果,你可能会大吃一惊! 目录 一、Synchronized实现多线程并发 二、使用AtomicInteger原子类实现多线程并发 三、效果对比 一、

窗外的羊 969

使用LSTM实现自动调制识别(RML2018.01a)

目录一、LSTM的代码实现1.1 导入包1.2 数据读取及数据集划分1.3 数据预处理1.4 构建LSTM模型 本文基于RML2018.01a大型数据集,给出LSTM的信号识别的实现方式(附代码) RML2018.01a数据集信息如下: 模型 传送门 CNN/ResNet 使用CNN/ResNet实现自动调制识别(RML2018.01a) LSTM 使用LSTM实现自动调制识别(RML2018.01a)) 一、LSTM的代码实现 1.1 导入包 import numpy as np

QAQIknow的博客 6121

【搞定 Java 并发面试】面试最常问的 Java 并..

Java 并发进阶常见面试题总结 1. synchronized 关键字 1.1. 说一说自己对于 synchronized 关键字的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(mo...

黑马程序员广州中心的专栏 247

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

volatile 选型对比篇 —— 与 synchronized/Atomic 类的核心差异

在实际开发中,并发编程的需求往往更加复杂:有时需要保证原子性,有时需要兼顾性能,这时候就需要在 volatile 、 synchronized 、 Atomic 类之间做出选择。 本篇文章将从核心特性、底层实现、适用场景三个维度,全面对比三者的差异,帮你建立清晰的选型决策逻辑。

y245166349的专栏 1156

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ReetrantLock Synchronized Atomic的性能对比

之前看到了一篇帖子关于Lock和Synchronized的性能,写的是Lock比Synchronized的性能要好,可是,我试了下,结果却不是这样的,我所使用的JDK的版本是1.7,可能跟原帖作者用的JDK版本不一样,JDK对Synchronized做了优化。 下面是我测试性能的代码: package juc; import java.util.concurrent....

dengmian2109的博客 344

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Atomic 原子类、Synchronized、ReentrantLock的详细解析

算法,通过硬件提供的原子指令实现线程安全的更新。方法获取变量的内存偏移量,通过偏移量直接定位变量位置。CAS 的方法通常在 Java 中用。为了找到变量在内存中的位置,的方法完成内存值的更新。当多个线程竞争同一个锁时,提供,原子类通过调用。处于不同状态的对象头。

weixin_48968553的博客 1262

# synchronized、Lock和Atomic

synchronized 关键字:使用简单,自动管理锁的获取和释放。适合简单的同步需求。缺乏一些高级特性,如公平锁和中断等待。Lock 接口:提供更灵活的锁管理机制。支持更多的高级特性,如公平锁、中断等待和尝试获取锁。需要手动管理锁的获取和释放,使用稍显复杂。Atomic 类:提供高效的原子操作,无需显式锁。适用于简单的原子操作,性能优越。不适用于复杂的同步逻辑。

1015

java synchronized atomic_synchronized与atomic性能对比

写了两个例子,对这两种机制进行对比,发现性能差距在6倍以上。synchronized的例子:public class SyncInc {public static void main(String[] args) {CountDownLatch latch = new CountDownLatch(10);long begin = System.nanoTime();for (int i = 0;...

weixin_39534978的博客 220

Synchronized、Lock和Atomic性能测试

随着循环次数cycles成倍增大,Synchronized的性能变得越来越低,Atomic和Lock的性能始终处于稳定状态,从结果看Atomic性能更高(因为资源竞争并不激励,只有8个线程,其中4个线程写操作,4个读操作) 建议多线程开发中对资源共享互斥操作使用Lock package concurrency; import java.util.Random; import java.util....

lilee 637

面试题整理:Java多线程(一)volatile、synchronized、ReentrantLock、Atomic、ThreadLocal、AQS、Future

volatile、synchronized、ReentrantLock、Atomic、ThreadLocal

weixin_45329799的博客 1371

java多线程 synchronized volatile Atomic LOCK的使用

/** * @Package * @Description * @author chenj * @date 2015-9-14 下午11:09:40 * @version V1.0 */ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; impo

troy-J2EE 的博客 1282

java synchronized atomic_atomic 包、synchronized | Java 中线程安全

相关阅读之前已经说过了,我们在保证线程安全的时候主要就是保证线程安全的 3 大特性,原子性、可见性、有序性、而在 JMM 的层面也已经做了相关的操作,比方说 JMM 定义的 8 种原子操作以及相关的规则,happens-before 原则。今天主要就来看看 Java 中实现线程安全的方法之二,使用 atomic 包,synchronized 关键字。首先说说 AtomicInteger 这个类,我...

weixin_36414025的博客 257

各种同步方法性能比较(synchronized,ReentrantLock,Atomic)

5.0的多线程任务包对于同步的性能方面有了很大的改进,在原有synchronized关键字的基础上,又增加了ReentrantLock,以及各种Atomic类。了解其性能的优劣程度,有助与我们在特定的情形下做出正确的选择。  总体的结论先摆出来:   synchronized:  在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能...

梦一样的博客,神话般的感觉 808

synchronized、volatile、Atomic区别和用法

可见性:指的是在一个线程中修改变量的值以后,在其他线程中能够看到这个值。 synchronized关键字除了有互斥的作用外,还有可见性的作用。synchronized保证了synchronized块中变量的可见性,而volatile则是保证了所修饰的变量的可见。因为volatile只是在保证了同一个变量在多线程中的可见性,所以它更多是用于修饰作为开关状态的变量,即Boolean类型的变量。

qbian的博客 3950
上一篇: 深入研究java.lang.ThreadLocal类 -- JAVA 进阶
下一篇: HTTP请求报文和HTTP响应报文 -- JAVA 基础
qishun2xiao
博客等级 码龄9年 15粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值