多线程的原子操作

简介: 多线程的原子操作

20200228205514658.png

package com.chot;
/**
 * @program: rtm
 *
 * @description: 原子操作demo
 *
 * @author: ninesun
 *
 * @create: 2019-11-18 09:28
 **/
import java.util.concurrent.atomic.AtomicInteger;
/*
 * 下边两个操作多试几次总会出现不一样的值
 * 这是因为第一个操作是非线程安全的,会出现多个线程同时操作一个值的情况
 * 后边那个则是原子操作有不可分割性质,所以不会出现那种情况
 * */
public class TestMyAtomic {
  static int index = 0;
  static int num = 10000;
  static AtomicInteger atomicIndex = new AtomicInteger(0);//设置初始值为0
  public static void main(String[] args) {
    //情况一
    //正常的index++操作属于非原子性操作
    //创建一万个线程进行index++操作
    Thread[]  threads = new Thread[num];
    for (int i = 0; i < num; i++) {
      Thread t = new Thread() {
        @Override
        public void run() {
          index++;
        }
      };
      t.start();
      threads[i] = t;
    }
    for (Thread t : threads) {
      try {
        //确保当前t线程加入主线程,运行完毕再继续后边操作
        t.join();
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    System.out.println(index);
    //情况二
    //以下是原子操作
    Thread[]  threadsAtomic = new Thread[num];
    for (int i = 0; i < num; i++) {
      Thread t = new Thread() {
        @Override
        public void run() {
          atomicIndex.incrementAndGet();
        }
      };
      t.start();
      threadsAtomic[i] = t;
    }
    for (Thread t : threadsAtomic) {
      try {
        //确保当前t线程加入主线程,运行完毕再继续后边操作
        t.join();
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    System.out.println(atomicIndex.intValue());
  }
}
目录
相关文章
|
6月前
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
【4月更文挑战第6天】Java的`java.util.concurrent.atomic`包提供了一系列原子类,如`AtomicInteger`和`AtomicLong`,利用CPU原子指令保证无锁情况下变量更新的原子性,从而实现线程安全。这些类在高并发场景下能避免线程阻塞,提高性能。`AtomicInteger`和`AtomicLong`支持原子地增加、减少和设置值,而`AtomicReference`则适用于原子更新引用对象。尽管原子类具有非阻塞、线程安全和易用等优点,但它们仅保证单个变量的原子性,复杂操作可能仍需传统同步机制。了解其工作原理和局限性,有助于提升并发应用性能。
98 0
|
6月前
多线程并发锁的方案—原子操作
多线程并发锁的方案—原子操作
|
3月前
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
在Java多线程环境中,共享资源的并发访问可能导致数据不一致。传统的同步机制如`synchronized`关键字或显式锁虽能保障数据一致性,但在高并发场景下可能导致线程阻塞和性能下降。为此,Java提供了`java.util.concurrent.atomic`包下的原子类,利用底层硬件的原子操作确保变量更新的原子性,实现无锁线程安全。
32 0
|
4月前
|
算法 编译器 C++
开发与运维线程问题之在C++的原子操作中memory_order如何解决
开发与运维线程问题之在C++的原子操作中memory_order如何解决
43 2
|
6月前
|
存储 安全 Java
java多线程之原子操作类
java多线程之原子操作类
|
6月前
|
设计模式 并行计算 安全
【C/C++ 多线程编程】深入探讨双检锁与原子操作
【C/C++ 多线程编程】深入探讨双检锁与原子操作
208 0
|
6月前
|
Linux C语言
linux c 多线程 互斥锁、自旋锁、原子操作的分析与使用
生活中,我们常常会在12306或者其他购票软件上买票,特别是春节期间或者国庆长假的时候,总会出现抢票的现象,最后总会有人买不到票而埋怨这埋怨那,其实这还好,至少不会跑去现场或者网上去找客服理论,如果出现了付款,但是却没买到票的现象,那才是真的会出现很多问题,将这里的票引入到多线程中,票就被称为临界资源。
80 0
|
6月前
|
安全 Linux 调度
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
83 0
|
存储 API C#
C#多线程系列(3):原子操作
C#多线程系列(3):原子操作
349 0
C#多线程系列(3):原子操作
|
安全 Java 索引
Atomic实现多线程下,无锁的进行原子操作
Atomic实现多线程下,无锁的进行原子操作
474 0
Atomic实现多线程下,无锁的进行原子操作