# Java 项目方案:保障原子性
## 一、项目背景
在多线程编程中,保障操作的原子性是确保数据一致性和正确性的关键。原子性指的是操作要么全部完成,要么一不做,保证在执行期间不会被其他操作干扰。这对于银行转账、库存管理等系统尤为重要。本文将深入探讨 Java 中如何保障原子性,并提供相应的代码示例。
## 二、项目目标
本项目旨在开发一个简单的银行转账系统,确保转账操作的原子性。系统需要            
                
         
            
            
            
            实现并发操作的方法有两种:一种是使用锁(Synchronized和Lock),另外一种是使用原子操作(CAS)Synchronized基于阻塞的锁机制可能会带来的问题:a. 被阻塞的线程优先级很高 b.拿到锁的线程一直不释放锁怎么办? c.大量的竞争消耗cpu,同时带来死锁或者其他安全问题基于上述问题,提出了CAS原子操作 a.CAS原理:利用现代处理器都支持的CAS指令,循环这个指令,直到成功为            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-27 07:39:21
                            
                                59阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            原子性、可见性、有序性解决方案(一)原子性原子性是指:一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行。在Java中当我们讨论一个操作具有原子性问题是一般就是指这个操作会被线程的随机调度打断。JMM对原子性的保证大概分以下几种类型:java自带原子性、synchronized、Lock锁、原子操作类(CAS)。下面我们来一个一个细说。1. java自带原子性在Java中,            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-10-07 18:39:38
                            
                                260阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            1.volatilevolatile关键字是一个特征修饰符,确保本条指令不会因编译器的优化而省略。可以li理解为阻止编译器对代码进行优化。先了解一下原子性(atomicity)和 可见性(visibility)以及有序性1.1原子性即一个操作或者一段代码,要么全部执行并且执行过程中不被任何因素打算,要么不执行。1.2原子操作1.2.1处理器实现原子操作-(总线锁、缓存锁)1.处理器会自动            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-17 12:45:29
                            
                                227阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            文章目录简介并发编程的3个基本概念1.原子性2.可见性3.有序性使用保证可见性,不保证原子性volatile特征禁止指令重排序volatile使用场景volatile无法保证原子性volatile使用注意点 简介volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchroni            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-19 18:47:51
                            
                                37阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            # Java 原子类如何保证原子性
在多线程编程中,原子性是一个非常重要的概念。简而言之,原子性指的是一个操作要么全部执行,要么完全不执行。在 Java 中,原子类主要是通过使用低级的操作系统特性来实现这一点,以确保在多线程环境下的操作不会被其他线程中断。
## 1. Java 原子类概述
Java 提供的原子类主要位于 `java.util.concurrent.atomic` 包下。这些            
                
                    
                        
                                                            
                                                                        
                                                                                        原创
                                                                                    
                            2024-10-12 06:24:06
                            
                                22阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            JMM定义了一套在多线程读写共享数据时(成员变量,数组),对数据的可见性,原子性,有序性的规则和保障1.保证原子性原子性:要么全部执行,要么全不执行。 Java中有两种方式实现原子性 一种是使用锁机制,锁具有排他性,也就是说它能够保证一个共享变量在任意一个时刻仅仅被一个线程访问,这就消除了竞争;另一种CAS指令。怎么保证原子性? 加锁:synhronized、Lock 在java中提供了两个高级的            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-10-13 22:13:44
                            
                                233阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            文章目录原子性代码验证解决方法可见性代码验证导致原因解决方法有序性概念代码验证 原子性原子性的概念是 当一个线程访问某个共享的变量时,对其他线程来看,该操作要么执行完毕要么没有发生,不会看到中间值。所以原子性只存在于多线程共享成员变量中,单线程或者多线程个对局部变量的操作都可以理解为是原子性的。java中八大基本类型中long、double类型修饰的变量是非原子性,除此之外,剩下的六个都是原子性            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-23 08:46:45
                            
                                96阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            JDK源码中,在研究AQS框架时,会发现很多地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性,Java被隔离在硬件之上,明显力不从心,这时为了能直接操作操作系统层面,肯定要通过用C++编写的native本地方法来扩展实现。JDK提供了一个类来满足CAS的要求,sun.misc.Unsafe,从名字上可以大概知道它用于执行低级别、不安全的操作,AQS就是使用此类完            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2024-04-13 05:59:27
                            
                                21阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            前言关于JMM的内容其实并不多,指令重排,可见性,原子性,就这三大块,这次的简单总结,并没有过多深入总结,也只是总结面试上的内容,本篇博客简单说一下原子性,并总结一下JMM中的相关面试问题原子性要说到什么是原子性,其实这个应该学过计算机的同学都应该知道,每次聊到原子性,都会老生常谈的几个实例也就是那几个,无非就是转账要么全部成功,要么全部失败,其操作组合是一个原子性的。其实通俗点理解就是一系列的操            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-06-26 17:57:15
                            
                                129阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            前言如果是单应用部署,直接通过synchronized关键字修改方法,就能解决,但是如果是分布式的部署 该方法就不能解决这个问题啦,此时就引出了一个分布式锁的概念。常用的分布式锁的实现方式有三种:基于数据库乐观锁(CAS)来实现基于 Redis 来实现基于 ZooKeeper 来实现二、执行流程 加锁和删除锁的操作,使用纯 Lua 进行封装,保障其执行时候的原子性。基于纯Lua脚本实现分布式锁的执            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-06-13 10:17:52
                            
                                241阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的,我们来看下哪些操作实现了这3个特性。原子性(atomicity): 由Java内存模型来直接保证原子性变量操作包括read, load, assign, use, store和write。大致可以认为基本数据类型的访问读写是具有原子性的。如果应用场景需要一个更大范围的原子性保证,Java内存模型还提供了lock和            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-02 13:06:44
                            
                                51阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            Java的原子性&&可见性&&有序性
原子性
定义:
原子性:是指一个操作或多个操作要么全部执行,且执行的过程不会被任何因素打断,要么就都不执行。            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-07-18 13:16:45
                            
                                151阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            1 引入所谓的原子性是指在一次操作或者多次操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行。class VolatileAtomicThread implements Runnable {
    // 定义一个int类型的遍历
    private int count = 0 ;
    @Override
    public void run(            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-18 18:32:50
                            
                                41阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            一、原子性 
  提供了互斥访问,同一时刻只能有一个线程对它进行操作。 
 
  保证原子性的操作: 
 1.Atomic    1)Atomic:CAS(Unsafe.compareAndSwapInt) incrementAndGet()函数实现一个整数自增的操作count++,通过查看源码发现AtomicInteger下的 
 自增操作incrementAndGet(),            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-19 16:06:00
                            
                                99阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            一、定义 1 原子性      原子是发生化学中的最小单位,即原子具有不可再拆分、不可分割的特点。顾名思义,原子操作具有不可中断性,即某个线程进入该原子操作后,就不会被中断,直到其执行完成(如:赋值)。   (1)对于读写除long和double之外的基本类型变量的简单操作,可以保证它们的原子性来操            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-10 23:17:58
                            
                                43阅读
                            
                                                                             
                 
                
                             
         
            
            
            
            这一节来对比下synchronized和volatile关键字在三大性质中的不同。1. 原子性原子性是指一个操作是不可中断的,要么全部执行成功,要么全部执行失败。即使在多线程情况下,也能保证不被其它线程干扰。我们来看下面几个例子int a = 10;  // 1 
++a;  // 2
int b = a;  // 3
a = a+1;  // 4在上面的三个操作中,只有第一个操作时具有原子性的。            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-07-21 16:24:11
                            
                                233阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            一、CAS原理:CAS的全程即Compare And Swap,翻译成中文为比较并交换;CAS操作依赖于CPU指令CMPXCHG来实现比较并交换操作的原子性,通过查看HotSpot源码如下: 可以看到这个实现跟CPU的类型相关,程序会根据当前处理器的类型来决定是否为cmpxchg指令添加lock前缀。如果程序是在多处理器上运行,就为cmpxchg指令加上lock前缀(lock cmpxc            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-09-07 14:47:57
                            
                                55阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            Java内存模型中原子性,有序性,可见性是个什么东西?
一般我们在并发编程中,会产生三类问题,原子性,有序性,可见性。            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-07-21 17:00:26
                            
                                73阅读
                            
                                                                             
                 
                
                                
                     
                                    
                             
         
            
            
            
            在java并发编程中,如果想要保证程序的线程安全,就要保证代码的原子性,可见性,有序性Java本身的原子性        由java内存模型来直接保证具有原子性变量操作的有 read/load/use/assign/store/write.java提供了原子性的技术保障有如下:1.synchronized(互斥锁)2.Lock(互斥锁)3.原子类(CAS)以            
                
                    
                        
                                                            
                                                                        
                                                                                        转载
                                                                                    
                            2023-08-31 23:26:59
                            
                                65阅读