线程安全性

原子性

Atomic包

案例

package com.keytech.task;

import java.util.concurrent.Executor;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

import java.util.concurrent.atomic.AtomicInteger;

import java.util.concurrent.atomic.LongAdder;

/**

* @className: AtomicTest

* @description: TODO 类描述

* @author: mac

* @date: 2020/12/27

**/

public class AtomicTest {

private static Integer clientTotal=5000;

private static Integer threadTotal=200;

private static AtomicInteger count=new AtomicInteger(0);

public static void main(String[] args) {

ExecutorService executorService = Executors.newCachedThreadPool();

Semaphore semaphore= new Semaphore(threadTotal);

for (int i = 0; i

executorService.execute(()->{

try{

semaphore.acquire();

update();

semaphore.release();

}catch (Exception e){

e.printStackTrace();

}

});

}

executorService.shutdown();

System.out.println("count:"+count);

}

private static void update(){

count.incrementAndGet();

}

}

getAndAddInt源码

public final int getAndAddInt(Object var1, long var2, int var4) {

int var5;

do {

var5 = this.getIntVolatile(var1, var2);

} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

return var5;

}

LongAddr

package com.keytech.task;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

import java.util.concurrent.atomic.LongAdder;

/**

* @className: LongAddrTest

* @description: TODO 类描述

* @author: mac

* @date: 2020/12/28

**/

public class LongAddrTest {

private static Integer clientTotal=5000;

private static Integer threadTotal=200;

private static LongAdder count=new LongAdder();

public static void main(String[] args) {

ExecutorService executorService = Executors.newCachedThreadPool();

Semaphore semaphore=new Semaphore(threadTotal);

for (int i = 0; i < clientTotal; i++) {

try{

semaphore.acquire();

update();

semaphore.release();

}catch (Exception e){

e.printStackTrace();

}

}

executorService.shutdown();

System.out.println("count"+count);

}

private static void update(){

count.increment();

}

}

AtomicLong

package com.keytech.task;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

import java.util.concurrent.atomic.AtomicLong;

/**

* @className: AtomicLongTest

* @description: TODO 类描述

* @author: mac

* @date: 2020/12/28

**/

public class AtomicLongTest {

private static Integer clientTotal=5000;

private static Integer threadTotal=200;

private static AtomicLong count=new AtomicLong();

public static void main(String[] args) {

ExecutorService executorService = Executors.newCachedThreadPool();

Semaphore semaphore=new Semaphore(threadTotal);

for (int i = 0; i < clientTotal; i++) {

try{

semaphore.tryAcquire();

update();

semaphore.release();

}catch (Exception e){

e.printStackTrace();

}

}

executorService.shutdown();

System.out.println("count"+count);

}

private static void update(){

count.incrementAndGet();

}

}

LongAddr与AtomicLong的区别

LongAddr与AtomicLong的使用场景

java 线程安全Long_【Java】线程安全之原子性Atomic(AtomicInteger|LongAdder|AtomicLong)相关推荐

  1. 线程安全之原子性Atomic(AtomicInteger|LongAdder|AtomicLong)

    线程安全性 当多线程访问某个类时,不管运行环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何的同步或者协同,这个类都能表现出正确的行为,那么这个类就是线程安全的. 原子性 提供 ...

  2. 动力节点Java培训告诉你Java线程的多功能用法

    现在的java开发可谓是八仙过海各显神通啊!遥想当下各种编程语言萎靡不振,而我Java开发异军突起,以狂风扫落叶之态,作为Java培训行业的黄埔军校,为了守护Java之未来,特意总结了一些不被人所熟知 ...

  3. java线程 同步与异步 线程池

    1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

  4. Java并发编程 synchronized保证线程安全的原理

    文章转载致博客 blog.csdn.net/javazejian/- 自己稍加完善. 线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源 ...

  5. Java多线程知识点整理(线程池)

    2019独角兽企业重金招聘Python工程师标准>>> 1.线程池的使用 线程池一般配合队列一起工作,是线程池限制并发处理任务的数量.然后设置队列的大小,当任务超过队列大小时,通过一 ...

  6. Java 多线程(七) 线程间的通信

    Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...

  7. java队列怎么实现线程_Java中利用线程和队列实现入库操作

    Java单线程中,如果需要大量的数据库操作,会在IO方面产生瓶颈,特别是数据库连接失败时,大量资源会消耗在数据库连接的检测上,从而使程序的实时响应速度变慢.解决的办法就是将数据库操作单独放置在一个线程 ...

  8. java线程安全性_Java并发-线程安全性

    1.什么是线程安全性? 在线程安全性的定义中,最核心的就是正确性.当多线程访问调用某个类时,线程之间不会出现错误的交互,不管运行时线程如何交替执行,并且在主调代码不需要任何同步或协同,这个类都能表现出 ...

  9. 为什么阿里Java规约禁止使用Java内置Executors创建线程池?

    IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...

最新文章

  1. python使用方法-python中dict使用方法详解
  2. 关于C++14:你需要知道的新特性
  3. 排序之选择排序:简单选择+堆排序
  4. 怎么重置blockinput的锁_OPPOA9锁屏密码忘了怎么办? OPPO忘记锁屏密码的解决办法...
  5. mysql cpu高 重启无效_解决mysqlcpu高的问题
  6. 我又发现一个直接就能安装中文小红帽的方法
  7. ReactiveCocoa 5.0 初窥:可能是最痛的一次升级
  8. 黑马程序员_银行业务调度系统
  9. Java工程师的职业规划(最全版本)
  10. android studio JNI Cmake Erro at 运行失败
  11. MySQL数据库笔记
  12. 分析型数据库产品的排头兵GBase 8a
  13. HTML中的表格及样式的设置
  14. 编程学习了解:一个优秀的程序员必备的五点能力,你都满足了吗?
  15. kafka 启动时提示 /brokers/ids/1001 is: NODEEXISTS
  16. 电商项目的数据库表设计(MySQL版)
  17. 【数独 2】候选数法解数独谜题-挖掘更深的信息-C++实现
  18. 很贴心的一份,适合非科班入门计算机的课程路线
  19. 滴滴官网图片切换效果
  20. 在职人员如何发表期刊论文

热门文章

  1. SAX EntityResolver 的作用
  2. SDL 从内存流中加载图像并显示
  3. [转载]压岁钱年年涨的行情不要太纠结
  4. OpenCV-获取图像中圆线上的数据
  5. OpenCV-中值滤波cv::medianBlur
  6. php header是什么,学习猿地-php header什么意思
  7. linux在当前目录下打开终端,linux - 终端:在窗口中打开当前路径? - Ubuntu问答...
  8. matlab中load seamout,matlab中的save与load函数
  9. 测试人员必看——掌握7大技能,做好自动化测试就不是问题!
  10. java转动的风扇课程设计,课程设计—智能风扇设计报告