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相关推荐

  1. 【并发编程十九】芊程(fiber)

    [并发编程十九]芊程(fiber) 一.前言 二.芊程(fiber) 1.线程中使用芊程 2.获取当前芊程数据 3.从芊程切回线程 4.创建新的芊程 5.删除芊程对象 6.在不同芊程间切换 7.芊程局 ...

  2. 【檀越剑指大厂--并发编程】并发编程总结

    并发编程 一.并发基础 1.什么是并行和并发? 并行,表示两个线程同时(同一时间)做事情. 并发,表示一会做这个事情,一会做另一个事情,存在着调度. 单核 CPU 不可能存在并行(微观上). 2.什么 ...

  3. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  4. 【Java并发编程】并发编程大合集

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...

  5. 【转】Java并发编程:并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...

  6. 学习笔记:Java 并发编程⑥_并发工具_JUC

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  7. 并发编程-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 ...

  8. 并发编程-02并发基础CPU多级缓存和Java内存模型JMM

    文章目录 CPU多级缓存 CPU多级缓存概述 CPU 多级缓存-缓存一致性协议MESI CPU 多级缓存-乱序执行优化-重排序 JAVA内存模型 (JMM) 计算机硬件架构简易图示 JAVA内存模型与 ...

  9. 并发编程-01并发初窥

    文章目录 引言 思维导图 基础知识构建 涉及的知识点一览 高并发处理思路与手段一览 并发初窥 概念 并发问题模拟 代码 引言 说来惭愧,一直没有系统的梳理过并发编程的知识,这次借着学习_Jimin_老 ...

最新文章

  1. KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎
  2. linux下source命令使用详解
  3. 【安卓开发 】Android初级开发(七)MD5加密
  4. python--迭代器与生成器
  5. HoloLens的显示分辨率有多少?
  6. 用js小类库获取浏览器的高度和宽度信息
  7. tf.transpose函数解析
  8. 利用C#实现Pdf转图片
  9. POI java.lang.IllegalArgumentException: Merged region xxx must contain 2 or more cells问题解决
  10. 北京地铁21号线_北京地铁22号线(即平谷线)全线21站具体位置确定了!
  11. HP11(HP其他喷头也可) 喷头程序开发项目外包
  12. 嵌入式Linux自学笔记(二)——文件IO
  13. ADT: Graph 图
  14. java版仿拼多多Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务 拼团商城源码
  15. MetaTrader LiveUpdate 概览
  16. Python之人机猜拳游戏
  17. jquery input值发生变化时,时时触发事件 input propertychange 、 cheng
  18. lsass.exe--系统错误 安全帐户管理初始化失败,原因是以下错误:句柄无效.错误状态:0xc0000008...
  19. 审视CRM的五大具体工作 满足客户需求
  20. 猪,是怎么看互联网的!

热门文章

  1. 小程序---canvas画图,生成分享图片,画图文字换行
  2. springboot-整合freemarker
  3. android:ellipsize实现跑马灯效果总结
  4. MYSQL 取随机记录的方法
  5. (转)一个带自定义分页,排序功能的DATAGRID控件(公开源码)
  6. Mac下使用ABTestingGateway快速搭建灰度网关
  7. SQL AUTO INCREMENT 字段
  8. TCP 连接断连问题剖析
  9. ZOJ-2571 Big String Outspread 模拟
  10. 怎么在代码中打开、关闭屏幕旋转