湖南地区,国内十大云服务器商中哪个最适合网站优化推广?

摘要:国内十大云服务器商排名,湖南网站优化推广,做网站广告联盟赚钱,餐饮装修简介 volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方
国内十大云服务器商排名,湖南网站优化推广,做网站广告联盟赚钱,餐饮装修简介 volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制#xff1a;同步块#xff08;或方法#xff09;和 volatile 变量#xff0c;相比于synchronized#xff08;synchronized通常称为重量级锁#xff09;#xff0c;volatile更轻量级同步块或方法和 volatile 变量相比于synchronizedsynchronized通常称为重量级锁volatile更轻量级因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差有时它更简单并且开销更低而且其使用也更容易出错。 Java volatile关键字用于将Java变量标记为“存储在主存储器中”。更确切地说这意味着每次读取一个volatile变量都将从计算机的主内存中读取而不是从CPU缓存中读取并且每次写入volatile变量都将写入主内存而不仅仅是CPU缓存。 实际上自Java 5以来volatile关键字保证的不仅仅是向主存储器写入和读取volatile变量。我将在以下部分解释。 特性 可以把对volatile变量的单个读/写看成是使用同一个锁对这些单个读/写操作做了同步 当我们声明共享变量为volatile后对这个变量的读/写将会很特别。理解volatile特性的一个好方法是把对volatile变量的单个读/写看成是使用同一个锁对这些单个读/写操作做了同步。 COPYclass VolatileFeaturesExample {//使用volatile声明64位的long型变量volatile long vl 0L;public void set(long l) {vl l; //单个volatile变量的写}public void getAndIncrement () {vl; //复合多个volatile变量的读/写}public long get() {return vl; //单个volatile变量的读} }假设有多个线程分别调用上面程序的三个方法这个程序在语义上和下面程序等价 COPYclass VolatileFeaturesExample {long vl 0L; // 64位的long型普通变量//对单个的普通 变量的写用同一个锁同步public synchronized void set(long l) { vl l;}public void getAndIncrement () { //普通方法调用long temp get(); //调用已同步的读方法temp 1L; //普通写操作set(temp); //调用已同步的写方法}public synchronized long get() { //对单个的普通变量的读用同一个锁同步return vl;} }如上面示例程序所示对一个volatile变量的单个读/写操作与对一个普通变量的读/写操作使用同一个锁来同步它们之间的执行效果相同。 锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性这意味着对一个volatile变量的读总是能看到任意线程对这个volatile变量最后的写入。 锁的语义决定了临界区代码的执行具有原子性。这意味着即使是64位的long型和double型变量只要它是volatile变量对该变量的读写就将具有原子性。如果是多个volatile操作或类似于volatile这种复合操作这些操作整体上不具有原子性。 简而言之volatile变量自身具有下列特性 原子性 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断要么就都不执行。 原子性是拒绝多线程操作的不论是多核还是单核具有原子性的量同一时刻只能有一个线程来对它进行操作。简而言之在整个操作过程中不会被线程调度器中断的操作都可认为是原子性。例如 a1是原子性操作但是a和a 1就不是原子性操作。Java中的原子性操作包括 基本类型的读取和赋值操作且赋值必须是数字赋值给变量变量之间的相互赋值不是原子性操作。所有引用reference的赋值操作java.concurrent.Atomic.* 包中所有类的一切操作 可见性 指当多个线程访问同一个变量时一个线程修改了这个变量的值其他线程能够立即看得到修改的值。 在多线程环境下一个线程对共享变量的操作对其他线程是不可见的。
阅读全文