美文网首页
线程安全

线程安全

作者: cclucc | 来源:发表于2019-11-15 19:44 被阅读0次
三个核心概念
  1. 原子性
  2. 可见性
  3. 顺序性
怎么保证原子性
  1. synchronized
  2. cas。利用了CPU级别的CAS指令,由于是CPU级别的指令,其开销比需要操作系统参与的锁的开销小。

前两种方法原理一样,通过锁来实现资源的排它性。
使用锁,可以保证同一时间只有一个线程能拿到锁,也就保证了同一时间只有一个线程能执行申请锁和释放锁之间的代码。

public void testLock () {
  lock.lock();
  try{
    int j = i;
    i = j + 1;
  } finally {
    lock.unlock();
  }
}

使用非静态同步方法时,锁住的是当前实例;使用静态同步方法时,锁住的是该类的Class对象;使用静态代码块时,锁住的是synchronized关键字后面括号内的对象。

public void testLock () {
  synchronized (anyObject){
    int j = i;
    i = j + 1;
  }
}

怎么保证可见性

volatile关键字可以保证可见性。当使用volatile修饰某个变量时,它会保证对该变量的修改会立即被更新到内存中,并且将其它缓存中对该变量的缓存设置成无效

怎么保证顺序性

jvm有一些隐式的原则保证顺序。 happens-before原则(先行发生原则)

  1. 传递规则:如果操作1在操作2前面,而操作2在操作3前面,则操作1肯定会在操作3前发生。
  2. 锁定规则:一个unlock操作肯定会在后面对同一个锁的lock操作前发生。
  3. volatile变量规则:对一个被volatile修饰的写操作先发生于后面对该变量的读操作。
  4. 程序次序规则:一个线程内,按照代码顺序执行
  5. 线程启动规则:Thread对象的start()方法先发生于此线程的其它动作
  6. 线程终结原则:线程的终止检测后发生于线程中其它的所有操作
  7. 线程中断规则: 对线程interrupt()方法的调用先发生于对该中断异常的获取
  8. 对象终结规则:一个对象构造先于它的finalize发生

相关文章

  • atomic & nonatomic

    什么是线程安全??? 线程安全:多线程操作共享数据不会出现想不到的结果就是线程安全的,否则,是线程不安全的。 at...

  • ConcurrentHashMap源码设计分析

    二、线程安全(Thread-safe)的集合对象:● Vector 线程安全● HashTable 线程安全● S...

  • HashMap 和 Hashtable 的区别

    线程安全: HashMap 是非线程安全的,而 Hashtable 是线程安全的,因为 Hashtable 内部的...

  • Java 的 StringBuffer 和 StringBuil

    区别就是:线程安全,StringBuffer 是线程安全的,StringBuilder 不是线程安全的。 他俩的实...

  • Java单例模式,线程安全

    懒汉式:线程安全,开销大 双重检查锁:线程安全,根据需求使用 静态内部类锁:线程安全,比较推荐 饿汗式:线程安全,...

  • 2018-06-12 第三十七天

    一、线程安全 线程安全的问题,是针对多线程的程序。单线程的情况下,是不存在线程安全问题。 产生线程安全问题的原因:...

  • 线程安全知多少

    1. 如何定义线程安全 线程安全,拆开来看: 线程:指多线程的应用场景下。 安全:指数据安全。 多线程就不用过多介...

  • JAVA 线程安全

    线程安全定义 一个类在可以被多个线程安全调用时就是线程安全的。 线程安全分类 线程安全不是一个非真即假的命题,可以...

  • synchronized锁

    一、线程安全的概念与synchronized 1、线程安全概念 并发程序开发的一大关注重点就是线程安全,线程安全就...

  • 线程安全的NSMutableDictionary

    NSDictionary是线程安全的,NSMutableDictionary是线程不安全的。利用锁来保证线程的安全...

网友评论

      本文标题:线程安全

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