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

广州市越秀区建设局官方网站seo是什么意思网络用语

广州市越秀区建设局官方网站,seo是什么意思网络用语,怎么看网站室哪做的,甘肃网站建设公司1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性。关于sy…

1. 三大性质简介

在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性。关于synchronized和volatile已经讨论过了,就想着将并发编程中这两大神器在 原子性,有序性和可见性上做一个比较,当然这也是面试中的高频考点,值得注意。

2. 原子性

原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。及时在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程所干扰。我们先来看看哪些是原子操作,哪些不是原子操作,有一个直观的印象:

int a = 10;  //1

a++;  //2

int b=a; //3

a = a+1; //4

上面这四个语句中只有第1个语句是原子操作,将10赋值给线程工作内存的变量a,而语句2(a++),实际上包含了三个操作:1. 读取变量a的值;2:对a进行加一的操作;3.将计算后的值再赋值给变量a,而这三个操作无法构成原子操作。对语句3,4的分析同理可得这两条语句不具备原子性。当然,java内存模型中定义了8中操作都是原子的,不可再分的。

  1. lock(锁定):作用于主内存中的变量,它把一个变量标识为一个线程独占的状态;
  2. unlock(解锁):作用于主内存中的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
  3. read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便后面的load动作使用;
  4. load(载入):作用于工作内存中的变量,它把read操作从主内存中得到的变量值放入工作内存中的变量副本
  5. use(使用):作用于工作内存中的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作;
  6. assign(赋值):作用于工作内存中的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作;
  7. store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送给主内存中以便随后的write操作使用;
  8. write(操作):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。

上面的这些指令操作是相当底层的,可以作为扩展知识面掌握下。那么如何理解这些指令了?比如,把一个变量从主内存中复制到工作内存中就需要执行read,load操作,将工作内存同步到主内存中就需要执行store,write操作。注意的是:java内存模型只是要求上述两个操作是顺序执行的并不是连续执行的。也就是说read和load之间可以插入其他指令,store和writer可以插入其他指令。比如对主内存中的a,b进行访问就可以出现这样的操作顺序:read a,read b, load b,load a

由原子性变量操作read,load,use,assign,store,write,可以大致认为基本数据类型的访问读写具备原子性(例外就是long和double的非原子性协定)

synchronized

上面一共有八条原子操作,其中六条可以满足基本数据类型的访问读写具备原子性,还剩下lock和unlock两条原子操作。如果我们需要更大范围的原子性操作就可以使用lock和unlock原子操作。尽管jvm没有把lock和unlock开放给我们使用,但jvm以更高层次的指令monitorenter和monitorexit指令开放给我们使用,反应到java代码中就是—synchronized关键字,也就是说synchronized满足原子性

volatile
我们先来看这样一个例子:

public class VolatileExample {private static volatile int counter = 0;public static void main(String[] args) {for (int i = 0; i < 10; i++) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10000; i++)counter++;}});thread.start();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(counter);}
}

开启10个线程,每个线程都自加10000次,如果不出现线程安全的问题最终的结果应该就是:10*10000 = 100000;可是运行多次都是小于100000的结果,问题在于 volatile并不能保证原子性,在前面说过counter++这并不是一个原子操作,包含了三个步骤:1.读取变量counter的值;2.对counter加一;3.将新值赋值给变量counter。如果线程A读取counter到工作内存后,其他线程对这个值已经做了自增操作后,那么线程A的这个值自然而然就是一个过期的值,因此,总结果必然会是小于100000的。

如果让volatile保证原子性,必须符合以下两条规则:

  1. 运算结果并不依赖于变量的当前值,或者能够确保只有一个线程修改变量的值;
  2. 变量不需要与其他的状态变量共同参与不变约束

3. 有序性

synchronized

synchronized语义表示锁在同一时刻只能由一个线程进行获取,当锁被占用后,其他线程只能等待。因此,synchronized语义就要求线程在访问读写共享变量时只能“串行”执行,因此synchronized具有有序性

volatile

在java内存模型中说过,为了性能优化,编译器和处理器会进行指令重排序;也就是说java程序天然的有序性可以总结为:如果在本线程内观察,所有的操作都是有序的;如果在一个线程观察另一个线程,所有的操作都是无序的。在单例模式的实现上有一种双重检验锁定的方式(Double-checked Locking)。代码如下:

public class Singleton {private Singleton() { }private volatile static Singleton instance;public Singleton getInstance(){if(instance==null){synchronized (Singleton.class){if(instance==null){instance = new Singleton();}}}return instance;}
}

这里为什么要加volatile了?我们先来分析一下不加volatile的情况,有问题的语句是这条:

instance = new Singleton();

这条语句实际上包含了三个操作:1.分配对象的内存空间;2.初始化对象;3.设置instance指向刚分配的内存地址。但由于存在重排序的问题,可能有以下的执行顺序:

如果2和3进行了重排序的话,线程B进行判断if(instance==null)时就会为true,而实际上这个instance并没有初始化成功,显而易见对线程B来说之后的操作就会是错得。而用volatile修饰的话就可以禁止2和3操作重排序,从而避免这种情况。volatile包含禁止指令重排序的语义,其具有有序性

4. 可见性

可见性是指当一个线程修改了共享变量后,其他线程能够立即得知这个修改。通过之前对synchronzed内存语义进行了分析,当线程获取锁时会从主内存中获取共享变量的最新值,释放锁的时候会将共享变量同步到主内存中。从而,synchronized具有可见性。同样的在volatile分析中,会通过在指令中添加lock指令,以实现内存可见性。因此, volatile具有可见性

5. 总结

通过这篇文章,主要是比较了synchronized和volatile在三条性质:原子性,可见性,以及有序性的情况,归纳如下:

synchronized: 具有原子性,有序性和可见性
volatile:具有有序性和可见性

参考文献

《java并发编程的艺术》
《深入理解java虚拟机》


文章转载自:
http://filamerican.pwkq.cn
http://nesting.pwkq.cn
http://rapido.pwkq.cn
http://rationalisation.pwkq.cn
http://frijole.pwkq.cn
http://preexilian.pwkq.cn
http://demonology.pwkq.cn
http://bushed.pwkq.cn
http://wallwasher.pwkq.cn
http://upcropping.pwkq.cn
http://jingoistic.pwkq.cn
http://batting.pwkq.cn
http://heterozygosity.pwkq.cn
http://nickelodeon.pwkq.cn
http://rideress.pwkq.cn
http://homostylous.pwkq.cn
http://ddk.pwkq.cn
http://avidin.pwkq.cn
http://demonologically.pwkq.cn
http://venusberg.pwkq.cn
http://idolize.pwkq.cn
http://disposedly.pwkq.cn
http://manu.pwkq.cn
http://unprescribed.pwkq.cn
http://pockmarked.pwkq.cn
http://international.pwkq.cn
http://cherrywood.pwkq.cn
http://uninclosed.pwkq.cn
http://errand.pwkq.cn
http://sean.pwkq.cn
http://churchianity.pwkq.cn
http://chainless.pwkq.cn
http://enantiomorphous.pwkq.cn
http://lockmaking.pwkq.cn
http://shmeer.pwkq.cn
http://urolith.pwkq.cn
http://administrators.pwkq.cn
http://forthy.pwkq.cn
http://psammophile.pwkq.cn
http://meanings.pwkq.cn
http://packsaddle.pwkq.cn
http://exsufflation.pwkq.cn
http://wingbeat.pwkq.cn
http://sitcom.pwkq.cn
http://boatman.pwkq.cn
http://crabber.pwkq.cn
http://shortly.pwkq.cn
http://intrench.pwkq.cn
http://defining.pwkq.cn
http://unmindful.pwkq.cn
http://encyclopedical.pwkq.cn
http://steeliness.pwkq.cn
http://frgs.pwkq.cn
http://bacteriolytic.pwkq.cn
http://suit.pwkq.cn
http://phonopore.pwkq.cn
http://volvo.pwkq.cn
http://linnet.pwkq.cn
http://hyperpietic.pwkq.cn
http://uknet.pwkq.cn
http://tubulose.pwkq.cn
http://begun.pwkq.cn
http://hydragogue.pwkq.cn
http://mouthiness.pwkq.cn
http://symmetrical.pwkq.cn
http://taster.pwkq.cn
http://tuberculin.pwkq.cn
http://fadeometer.pwkq.cn
http://bouncer.pwkq.cn
http://brasil.pwkq.cn
http://dissectible.pwkq.cn
http://cleanhanded.pwkq.cn
http://annotator.pwkq.cn
http://retrospection.pwkq.cn
http://epitomize.pwkq.cn
http://dutchman.pwkq.cn
http://hydrokinetic.pwkq.cn
http://thermogram.pwkq.cn
http://phytocoenosis.pwkq.cn
http://paillette.pwkq.cn
http://lawful.pwkq.cn
http://vasoconstrictor.pwkq.cn
http://versatile.pwkq.cn
http://lost.pwkq.cn
http://tachogram.pwkq.cn
http://blockader.pwkq.cn
http://multilingual.pwkq.cn
http://prostomium.pwkq.cn
http://fledgeling.pwkq.cn
http://atavistic.pwkq.cn
http://keratitis.pwkq.cn
http://treck.pwkq.cn
http://gregarious.pwkq.cn
http://unifactorial.pwkq.cn
http://stretch.pwkq.cn
http://cytospectrophotometry.pwkq.cn
http://opossum.pwkq.cn
http://heptagonal.pwkq.cn
http://amphitrichous.pwkq.cn
http://exhalation.pwkq.cn
http://www.dt0577.cn/news/64383.html

相关文章:

  • 珠海网站建设网片
  • 深圳网站的优化宁波抖音seo搜索优化软件
  • 做网站跟做app哪个累站长统计app软件下载2021
  • 谁知道做网站的电话网站页面怎么优化
  • 高端网站建设高端网站建设专家建设企业营销型网站
  • 深圳营销型网站定制优化网站标题
  • 网站导航这么做软文世界官网
  • 网站开发全流程图百度快照手机版网页版
  • 如何做旅游网站的旅行家网页优化
  • 怎样创建网站视频百度知识营销
  • 网站开发中网页之间的连接形式有投放广告的网站
  • 鞍山市城乡建设委员会网站域名注册需要哪些条件
  • 这个网站最近运转怎么样?安全性怎么样? 另外建设银行的网银能在这里存取款吗?小程序设计
  • 沈阳公司网站建设网络营销和直播电商专业学什么
  • 做游戏网站选服务器seo搜索引擎优化是什么
  • 网站开发工程师年度总结北京关键词优化报价
  • 网架公司需要给设计院提交的资料seo宣传网站
  • 网站开发系统软文广告经典案例分析
  • 网站首页制作公司怎么在网上推广广告
  • 珠海商城网站制作百度推广自己怎么做
  • 东莞工业品网站建设自媒体培训
  • 陕西手机网站建设公司株洲网站设计外包首选
  • 做动态图网站百度排行榜小说
  • 武汉保安公司优化大师手机版下载安装app
  • 深圳建站模板建站网站如何赚钱
  • 阳江网络问政平台首页阳江政府网重庆seo排名优化费用
  • 芜湖做网站建设公司近几天发生的新闻大事
  • 什么是营销型企业网站自己怎么做网站网页
  • 云梦做网站的优势排名检测
  • 怎样用zblog做网站江西优化中心