JUC并发编程十 并发架构--Unsafe
Unsafe提供了非常底层的,操作内存,线程的方法.Unsafe对象不能直接调用,只能通过反射获得.
import lombok.Data;
import sun.misc.Unsafe;import java.lang.reflect.Field;public class TestUnsafe {public static void main(String[] args) throws Exception {Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);Unsafe unsafe = (Unsafe)theUnsafe.get(null);System.out.println(unsafe);// 1. 获取域的偏移地址long idOffset = unsafe.objectFieldOffset(Student.class.getDeclaredField("id"));long nameOffset = unsafe.objectFieldOffset(Student.class.getDeclaredField("name"));Student student = new Student();System.out.println(student);// 2. 执行cas操作unsafe.compareAndSwapInt(student,idOffset,0,1);unsafe.compareAndSwapObject(student,nameOffset,null,"小明");// 3. 验证System.out.println(student);}
}@Data
class Student{volatile int id;volatile String name;
}
使用Unsafe构建自己的原子类
import sun.misc.Unsafe;import java.util.ArrayList;
import java.util.List;public class TestMyAtomicInteger {public static void main(String[] args) {Account.demo(new MyAtomicInteger(10000));}
}class MyAtomicInteger implements Account{private volatile int value; // 使用cas,必须是volatileprivate static final long valueOffset; // 获取域的偏移量private static final Unsafe UNSAFE;static{UNSAFE = UnsafeAccessor.getUnsafe();try {valueOffset = UNSAFE.objectFieldOffset(MyAtomicInteger.class.getDeclaredField("value"));} catch (NoSuchFieldException e) {e.printStackTrace();throw new RuntimeException(e);}}public int getValue(){return value;}public void decrement(int amount){while(true){int prev = this.value;int next = prev - amount;if(UNSAFE.compareAndSwapInt(this,valueOffset,prev,next)){break;}}}public MyAtomicInteger(int value){this.value = value;}@Overridepublic int getBalance() {return value;}@Overridepublic void withdraw(int amount) {decrement(amount);}
}interface Account{// 设置余额int getBalance();void withdraw(int amount);static void demo(Account account){List<Thread> ts = new ArrayList<>();for (int i = 0; i < 1000; i++) {// 创建1000个线程,每个线程减去10ts.add(new Thread(()->{account.withdraw(10);}));}ts.forEach(Thread::start);ts.forEach(t->{try {t.join();} catch (InterruptedException e) {e.printStackTrace();}});System.out.println(account.getBalance());}
}
import sun.misc.Unsafe;import java.lang.reflect.Field;public class UnsafeAccessor {private static final Unsafe unsafe;static{try {Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);unsafe = (Unsafe)theUnsafe.get(null);} catch (Exception e) {throw new Error(e);}}public static Unsafe getUnsafe(){return unsafe;}
}
JUC并发编程十 并发架构--Unsafe相关推荐
- 【并发编程十九】芊程(fiber)
[并发编程十九]芊程(fiber) 一.前言 二.芊程(fiber) 1.线程中使用芊程 2.获取当前芊程数据 3.从芊程切回线程 4.创建新的芊程 5.删除芊程对象 6.在不同芊程间切换 7.芊程局 ...
- 【檀越剑指大厂--并发编程】并发编程总结
并发编程 一.并发基础 1.什么是并行和并发? 并行,表示两个线程同时(同一时间)做事情. 并发,表示一会做这个事情,一会做另一个事情,存在着调度. 单核 CPU 不可能存在并行(微观上). 2.什么 ...
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- 【Java并发编程】并发编程大合集
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...
- 【转】Java并发编程:并发容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...
- 学习笔记:Java 并发编程⑥_并发工具_JUC
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...
- 并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍
文章目录 J.U.C脑图 J.U.C核心AQS简介 AQS底层数据结构 AQS特点 J.U.C脑图 为了体现出AQS和线程池的重要性,上图单独将AQS和线程池拿出来了. J.U.C的构成如下: J.U ...
- 并发编程-02并发基础CPU多级缓存和Java内存模型JMM
文章目录 CPU多级缓存 CPU多级缓存概述 CPU 多级缓存-缓存一致性协议MESI CPU 多级缓存-乱序执行优化-重排序 JAVA内存模型 (JMM) 计算机硬件架构简易图示 JAVA内存模型与 ...
- 并发编程-01并发初窥
文章目录 引言 思维导图 基础知识构建 涉及的知识点一览 高并发处理思路与手段一览 并发初窥 概念 并发问题模拟 代码 引言 说来惭愧,一直没有系统的梳理过并发编程的知识,这次借着学习_Jimin_老 ...
最新文章
- KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎
- linux下source命令使用详解
- 【安卓开发 】Android初级开发(七)MD5加密
- python--迭代器与生成器
- HoloLens的显示分辨率有多少?
- 用js小类库获取浏览器的高度和宽度信息
- tf.transpose函数解析
- 利用C#实现Pdf转图片
- POI java.lang.IllegalArgumentException: Merged region xxx must contain 2 or more cells问题解决
- 北京地铁21号线_北京地铁22号线(即平谷线)全线21站具体位置确定了!
- HP11(HP其他喷头也可) 喷头程序开发项目外包
- 嵌入式Linux自学笔记(二)——文件IO
- ADT: Graph 图
- java版仿拼多多Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务 拼团商城源码
- MetaTrader LiveUpdate 概览
- Python之人机猜拳游戏
- jquery input值发生变化时,时时触发事件 input propertychange 、 cheng
- lsass.exe--系统错误 安全帐户管理初始化失败,原因是以下错误:句柄无效.错误状态:0xc0000008...
- 审视CRM的五大具体工作 满足客户需求
- 猪,是怎么看互联网的!