美文网首页
lock和volatile

lock和volatile

作者: CHENpq | 来源:发表于2019-07-09 10:08 被阅读0次

```java

Lock lock = new ReentrantLock();

public int getNext(){

  lock.lock();

  int a = value++;

  lock.unlock();

  return a;

}

```

Lock 需要显示地获取和释放锁,繁琐

Synchronized不需要,简单

**Lock**

代码更灵活,自行管理

可以方便地实现公平性,有现成的已经实现的Lock类

非阻塞的获取锁

能被中断的获取锁

超时获取锁,可以设定获取时间,超时返回

**Volatile**

轻量级锁,被volatile修饰的变量在线程之间可见(一个线程修改了一个变量的值,在另一个线程可以读到修改后的值)

synchronized除了让线程互斥意外,还可以保证线程的可见性

```java

/*

* 多个线程拿到的是同一把锁

* 不然保证不了可见性

*/

public class Demo{

  public volatile int a =1;

  //在当前demo对象上加锁

  public synchronized int getA(){

    return a;

  }

  public synchronized void setA(int a){

    try{

      Thread.sleep(2)

    } catch(InterruptedException e){

      e.printStackTrace();

    }

    this.a=a;

  }

  public static void main(String[] args){

    Demo demo = new Demo();

    demo.a=10;

    new Thread(new Runnable(){

      @Override

      public void run(){

        System.out.print(demo.a);

      }

    }) .start();

    try {

      Thread.sleep(100);

    } catch(InterruptedException e){

      e.printStackTrace();

    }

    System.out.print(demo.getA());

  }

}

```

```java

public class Demo2{

  public volatile boolean run=false;

  public static void main(String[] args){

    Demo2 demo2= new Demo2();

    new Thread(new Runnable(){

      @Override

      public void run(){

      for(int i=1;i<=10;i++){

          System.err.print("running"+i+"time(s)");

        try {

          Thread.sleep(1000);

        } catch (InterruptedException e){

          e.printStackTrace();

        }

      }

      d.run=true;

      }

    }) .start();

    new Thread(new Runnable(){

      @Override

      public void run(){

        while(!demo2.run){

          // no action

        }

        System.err.print("Thread2 running")

      }

    }).start();

  }

}

```

volatile底层实现

多了一个Lock指令:在多处理器的系统上,

* 将当前系统处理器缓存行的内容写回到系统内存

* 写回到内存的操作回事的在其他cpu缓存了该内存地址的数据失效

相关文章

  • volatile和CAS的一些问题总结

    1.volatile和CAS底层都使用lock前缀实现,有什么共通和区别的地方? volatile通过lock保证...

  • lock和volatile

    ```java Lock lock = new ReentrantLock(); public int getNe...

  • java面试题(101-110)

    101.jvm相关参数 102.lock ,sychronized,volatile的区别 一:volatile和...

  • volatile、synchronized、lock详解

    volatile、synchronized、lock详解 1、volatile 被volatile定义的变量被一个...

  • Java线程 - Lock

    Lock 与 Syncronized 和 Volatiled 的区别? synchronized与volatile...

  • volatile、synchronized和Lock

    一、 volatie 1.作用 保证了线程之间内存的可见性,且防止了指令重排序 2.什么叫做线程间内存不可见?JM...

  • Java中的锁

    锁产生的背景 volatile和synchronized Lock接口 ReenTrantLock使用详解 同步实...

  • volitile

    1.volatile的定义和实现原理 对一个volatile进行写操作时对应的汇编指令 lock前缀的指令在多核处...

  • Thread

    Volatile CAS Lock相对synchronized块的优势 CountDownLatch、Cyclic...

  • volatile 关键字

    volatile 是什么? volatile是一种同步机制,比synchronized或者Lock相关类更轻量,因...

网友评论

      本文标题:lock和volatile

      本文链接:https://www.haomeiwen.com/subject/lhmtkctx.html