多线程与锁(3)
-
线程安全
- 指多线程下数据被多个线程操作,破坏了本来数据的合理性。
-
volatile关键字
- volatile关键字修饰的变量在改变时,全部线程可见
- 禁止命令重排
- 不保证原子性
-
如何做到线程安全
-
同步方法
-
public void synchronized myMethod(){ //do something; }
-
-
同步代码块
-
//object锁对象 synchronized(object) { //do something }
-
-
加锁lock
-
//一定要释放锁 一般放在finally确保锁释放 private Lock lock = new ReentrantLock(); // ReentrantLock是Lock的子类 private void method(Thread thread){ lock.lock(); // 获取锁对象 try { System.out.println("线程名:"+thread.getName() + "获得了锁"); // Thread.sleep(2000); }catch(Exception e){ e.printStackTrace(); } finally { System.out.println("线程名:"+thread.getName() + "释放了锁"); lock.unlock(); // 释放锁对象 } }
- 都是非公平锁
-
-
-
Atomic类
- 原理: 用了volatile关键词修饰value
-
原子更新基本类型
- AtomicBoolean:以原子更新的方式更新boolean;
- AtomicInteger:以原子更新的方式更新Integer;
- AtomicLong:以原子更新的方式更新Long;
-
原子更新数组类型
- AtomicIntegerArray:原子更新整型数组中的元素;
- AtomicLongArray:原子更新长整型数组中的元素;
- AtomicReferenceArray:原子更新引用类型数组中的元素
-
原子更新引用类型
-
AtomicReference:原子更新引用类型;
-
AtomicReferenceFieldUpdater:原子更新引用类型里的字段;
-
AtomicMarkableReference:原子更新带有标记位的引用类型;
-
-
原子更新字段类型
1. AtomicIntegeFieldUpdater:原子更新整型字段类; 2. AtomicLongFieldUpdater:原子更新长整型字段类; 3. AtomicStampedReference:原子更新引用类型,这种更新方式会带有版本号。而为什么在更新的时候会带有版本号,是为了解决CAS的ABA问题;