当前位置: 首页 > news >正文

合肥建设学校网站黑龙江省建设教育信息网站

合肥建设学校网站,黑龙江省建设教育信息网站,免费网站站,注册公司需要提供的资料及公司注册流程1 并发三大特性 1.1 原子性 一个或多个操作#xff0c;要么全部执行#xff0c;要么全部不执行。Java中#xff0c;对基本数据类型的变量的读取和赋值操作是原子性操作#xff0c;但不采取任何原子性保障措施的自增操作不是原子性的#xff0c;如#xff1a;i public c…1 并发三大特性 1.1 原子性 一个或多个操作要么全部执行要么全部不执行。Java中对基本数据类型的变量的读取和赋值操作是原子性操作但不采取任何原子性保障措施的自增操作不是原子性的如i public class AtomicTest {static int count 0;public static void main(String[] args) throws InterruptedException {for (int i 0; i 10; i) {new Thread(()-{for (int j 0; j 1000; j) {count;}}).start();}Thread.sleep(2000);System.out.println(count);} } 上述结果每次执行都不一致说明发生了线程安全问题 如何保证原子性 sychronized、lock锁、CASAtomicInteger 1.2 可见性 多个线程访问同一变量一个线程对其进行修改其它线程能及时感知 如何保证可见性 volatile、内存屏障、sychronized、lock锁 1.3 有序性 程序执行的顺序按代码先后顺序执行为了提升性能编译器和处理器常常会对指令做重排序这就可能引发有序性问题 Java有序性依赖内存屏障 如何保证有序性 volatile、内存屏障、sychronized、lock锁 2 Java内存模型JMM 并发编程需解决的问题 1 多线程间如何通信线程间以何种机制交换数据 2 多线程间如何同步不同线程间操作发生的相对顺序 2.1 JMM的抽象结构 JMM决定一个线程对共享变量的写入何时对另一个线程可见 JMM定义了线程和主存之间的抽象关系 1 共享变量存在主存 2 每个线程又有自己私有的本地内存 3 本地内存存共享变量的副本 4 线程对共享变量的所有操作都必须在本地内存中进行不能直接读取主存 线程A和线程B要通信的话必须经历以下两个步骤 线程A把本地内存A更新过的共享变量更新到主内存 线程B到主内存读取线程A更新过的共享变量 注线程A无法直接访问线程B的工作内存线程间通信必须经过主存 2.2 主内存与工作内存交互协议 八大原子操作 lock作用于主内存把一个变量标识为线程独占状态主内存 unlock释放主内存独占状态的变量主内存 read主内存变量传输到工作线程中主内存 load将read操作得到的变量放入工作内存的变量副本中工作内存 use工作内存中的变量传递给执行引擎工作内存 assgin从存储引擎得到的值赋值给工作内存的变量工作内存 store工作内存的一个变量值传到主内存工作内存 write将store操作从工作内存的变量值放到主内存变量主内存 八大原子操作必须满足的规则 1 把一个变量从主存复制到工作内存必须顺序地按照read和load操作把变量从工作内存同步回主存中必须顺序地按store和write操作 2 不允许 read load store write操作单独出现 3 不允许一个线程丢弃assgin变量在内存中改变之后必须同步到主存 4 不允许一个线程未发生assgin就从工作内存同步到主存 5 一个新的变量只能在主存中诞生不允许在工作内存中使用一个未被初始化的变量 6 一个变量同一时刻只允许一个线程进行lock但可以被同一线程重复执行多次但也需执行相同次数的unlock操作 7 若对一个变量执行lock操作会清空工作内存中此变量的值执行引擎使用这个变量必须重新load或assign 8 不允许unlock一个未被lock的变量 9 对一个变量执行unlock之前必须先把该变量同步到主内存中执行store和write 可见性问题的产生 线程B对变量flag的修改并不会让线程A感知只有当线程B对主存共享变量flag进行lock时线程A才会重新去主存中获取 Java中可见性底层的两种实现方式 1 内存屏障sychronized、Thread.sleep(10)、volatile 2 CPU上下文切换Thread.yield()、Thread.sleep() 2.3 锁的内存语义 锁释放和释放锁的内存语义 线程获取锁时JMM把该线程对应的本地内存置为无效 线程获取锁时JMM把该线程对应的本地内存中变量刷新到主存中 sychronized关键字的作用是确保多个线程访问共享资源时的互斥性和可见性在获取锁之前线程会将共享变量的最新值从主存 - 工作内存释放锁后会将修改的值刷到主存中保证可见性 2.4 volatile内存语义 2.4.1 volatile写的语义 当写一个volatile变量时JMM会把该线程对应的本地内存中的共享变量刷新到主存中 public static void main(String[] args) throws InterruptedException {for (int i 0; i 10; i) {new Thread(() - {for (int j 0; j 10000; j) {count; //static volatile int count 0;}}).start();}Thread.sleep(10000);System.out.println(count); } 上述结果会有所不同原因当变量被use到执行引擎中时volatile并不能改变执行引擎中的值当变量在执行引擎assign回工作内存中时会发生覆盖 2.4.2 volatile读的语义 当读一个volatile变量时JMM会把该线程对应的本地内存置为无效需要从主存中读取共享变量volatile读能保证每次读都是最新的数据 2.4.3 volatile内存语义实现原理
http://www.hkea.cn/news/14492318/

相关文章:

  • 门户做网站学网站建设可以从事什么工作
  • 网站建设小技巧网站开发html的题
  • WordPress电影公司网站主题ui培训怎么样
  • 电子商务网站建设基本组成太原网站排名优化价格
  • 美团网网站建设 费用淘宝新闻最新消息
  • 长沙住房与城乡建设部网站一起做网店官网app
  • 我的网站百度找不到了做网站的公司叫什么软件
  • 岳阳网站设计u视频素材模板免费下载网
  • 符合网络营销的网站教育培训机构微网站模板
  • dede手机wap网站模板铁道部建设管理司官方网站
  • 成都网站排名优化公司南京江北新区房价
  • 网站维护托管要多少钱国内免费crm
  • 衡阳市做淘宝网站建设asp.net网站模板免费下载
  • 建一个网站需要购买域名 虚拟主机织梦仿asp网站
  • 建立公司网站需要多少钱有实力高端网站设计地址
  • 网站备案密码查询wordpress 菜单两列显示不出来
  • 网站开发提高加载速度公司装修合同模板
  • php网站本地调试网上长期挣钱的方法
  • 电 器建设网站目的及功能定位网站程序设置主页面
  • 桂林市做网站的公司合肥建设网
  • 个人做淘宝客网站不能备案吗英雄联盟做的广告视频网站
  • 广州网站程序开发哪个网站做系统
  • ppt模板免费下载网南昌seo全网营销
  • 开发网站的经济可行性有哪些网站是做背景图片素材的
  • 太原做网站的公司网络服务业
  • 陇西做网站的公司洛阳信息港洛阳城事
  • 网站下方一般放什么原因网站建设地图怎么设置
  • 做非法网站要多少钱wordpress交互插件
  • 云课堂哪个网站做的好深圳企业官网网站建设哪家好
  • 在线购物网站怎么做久其软件公司网站