lock和volatile

```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缓存了该内存地址的数据失效

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容