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

public class AtomicTest {
int count = 0;
AtomicInteger count1 = new AtomicInteger(0);//2283 1895 2328 2015 2264

//57 56 55
synchronized void m() {
for (int i = 0; i < 150000; i++) {
count++;
}
}

void n() {
for (int i = 0; i < 150000; i++) {
count1.incrementAndGet();
}
}

public static void main(String a[]) {
long start = System.currentTimeMillis();
AtomicTest t = new AtomicTest();

List<Thread> threads = new ArrayList<>();

for (int i = 0; i < 10; i++) {
threads.add(new Thread(t::m, "thread " + i));
}
threads.forEach((o) -> o.start());
threads.forEach((o) -> {
try {
o.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("increase-->" + t.count);
System.out.println(System.currentTimeMillis() - start);

System.out.println("----------------------------------");

long start1 = System.currentTimeMillis();
AtomicTest t1 = new AtomicTest();

List<Thread> thread = new ArrayList<>();

for (int i = 0; i < 10; i++) {
thread.add(new Thread(t1::n, "thread " + i));
}
thread.forEach((o) -> o.start());
thread.forEach((o) -> {
try {
o.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("atomic-->" + t1.count1);
System.out.println(System.currentTimeMillis() - start1);
}
}

测试过后发现,并非Atomic方法一定由于synchronized
当低并发时(小于150000),Atomic效率优于synchronized
当高并发时(大于150000),synchronized效率优于Atomic
*150000为本机测试数据,不准

总结:
synchronized :重量级操作,基于悲观锁,可重入锁。
AtomicInteger:乐观 ,用CAS实现
当并发量大时,Atomic 出错概率会增大,不断校正错误更费时间

原文链接:https://blog.csdn.net/baidu_35773818/article/details/89604328

synchronized和AtomicXXX效率比较的更多相关文章

  1. java学习:JMM(java memory model)、volatile、synchronized、AtomicXXX理解

    一.JMM(java memory model)内存模型 从网上淘来二张图: 上面这张图说的是,在多核CPU的系统中,每个核CPU自带高速缓存,然后计算机主板上也有一块内存-称为主内(即:内存条).工 ...

  2. java synchronized修饰普通方法,修饰静态方法,修饰代码块,修饰线程run方法 比较

    synchronized用于多线程设计,有了synchronized关键字,多线程程序的运行结果将变得可以控制.synchronized关键字用于保护共享数据. synchronized实现同步的机制 ...

  3. Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)

    不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchro ...

  4. synchronized修饰普通方法,修饰静态方法,修饰代码块,修饰线程run方法 比较

    synchronized用于多线程设计,有了synchronized关键字,多线程程序的运行结果将变得可以控制.synchronized关键字用于保护共享数据. synchronized实现同步的机制 ...

  5. Java并发(4)- synchronized与CAS

    引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性.有序性以及"部分"原子性.但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这 ...

  6. Java:synchronized关键字引出的多种锁

    前言 Java 中的 synchronized关键字可以在多线程环境下用来作为线程安全的同步锁.本文不讨论 synchronized 的具体使用,而是研究下synchronized底层的锁机制,以及这 ...

  7. 死磕 java同步系列之ReentrantLock VS synchronized——结果可能跟你想的不一样

    问题 (1)ReentrantLock有哪些优点? (2)ReentrantLock有哪些缺点? (3)ReentrantLock是否可以完全替代synchronized? 简介 synchroniz ...

  8. 从jvm源码看synchronized

    从jvm源码看synchronized 索引 synchronized的使用 修饰实例方法 修饰静态方法 修饰代码块 总结 Synchronzied的底层原理 对象头和内置锁(ObjectMonito ...

  9. Synchronized 详解

    为了方便记忆,将锁做如下的分类 一.对象锁 包括方法锁(默认锁对象为this,当前实例对象)和同步代码块锁(自己指定锁对象) 1.代码块形式:手动指定锁定对象,也可是是this,也可以是自定义的锁 p ...

随机推荐

  1. docker 的常用命令汇总

  2. 开启 oracle 的闪回功能

    查看是否开启闪回 SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ NO 查看是否配置了db_r ...

  3. Scratch运动模块——有趣的弹球游戏(一)

    大家好!我是蓝老师,有了前几期Scratch的基础,相信大家早已摩拳擦掌,跃跃欲试了,甚至还有些小伙伴已经编写了非常不错的程序. 学习编程就是这样不断探索.主动思考.解决问题的过程. 本期内容: 课程 ...

  4. AtCoder练习

    1. 3721 Smuggling Marbles 大意: 给定$n+1$节点树, $0$为根节点, 初始在一些节点放一个石子, 然后按顺序进行如下操作. 若$0$节点有石子, 则移入盒子 所有石子移 ...

  5. Linux通用小技能

    Linux通用小技能 前言 无论你用ubuntu还是centos,通通没问题,运维这东西,踩坑写文档就是了. 小技能 新磁盘挂载 不管是阿里云还是腾讯云,还是自己的机器,请记住这条命令. mkfs.e ...

  6. 【leetcode】339. Nested List Weight Sum

    原题 Given a nested list of integers, return the sum of all integers in the list weighted by their dep ...

  7. js判断img是否存在

    利用image对象的onerror事件来判断,出错则更换image对象的src为默认图片的URL. <p>第一种情况:图片存在,正常显示    <img src="http ...

  8. orecle 查询数量 union合并 的排序问题

    orecle  查询数量 union合并 之后按照从小到大排序了,这边需要不排序的 直接将union  改成union all 就解决了. 图就不传了,验证没问题

  9. assert函数应用

    目录 1 assert概念 2 assert作用 3 assert用法 3.1 检测调用者传过来的指针参数是否正常 3.2 判断某个变量的范围 3.3 assert只检验一个地方 3.4 不能使用改变 ...

  10. Linux 01 LiunxvI命令大全

    进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...