JUC
線程的概念、啓動方式、常用方法
synchronized(Object)
- 不能用String常量 Integer Long
線程同步
- synchronized
- 鎖的是對象不是代碼 (開頭兩個字節)
- 普通方法鎖的是this static方法鎖的是xxx.class
- 鎖定方法 非鎖定方法 同時執行
- 鎖升級
偏向鎖->自旋鎖->重量級鎖
判斷使用什麼鎖:
線程數少->自旋鎖 線程數少->重量級鎖
操作消耗時間場 重量級鎖
volatile
- 保證線程可見性
- MESI
- 換錯一致性協議
- 禁止指令重排序(CPU)
CAS(無鎖優化 自旋)
- Compare And Set
- cas(V, Expected, NewValue)
- CPU原語支持
- ABA
- 加version (AtomicStampedReference)
- 如果基礎類型,無所謂 引用類型 有點問題
Unsafe = c c++指針
- 直接操作內存
- allocateMemory putXX freeMemory pageSize
- 直接生成類實例
- allocateInstance
- 直接操作類或實例變量
- ObjectFieldOffset
- getInt
- getObject
- CAS相關操作
- compareAndSwapObject
synchronized AtomicLong LongAdder
ReentrantLock(cas)
Lock lock = new ReentrantLock();
try {
lock.lock();
...
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
trylock
boolean locked = false;
try {
locked = lock.tryLock(5, TimeUnit.SECONDS);
System.out.println("m2 ..." + locked);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(locked) lock.unlock();
}
lockInterruptibly
公平鎖 非公平鎖
ReentrantLock lock = new ReentrantLock(true); // 公平鎖
CountDownLatch
CountDownLatch latch = new CountDownLatch(1);
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
...
latch.countDown();
CyclicBarrier
不斷滿人發車 每滿多少線程才執行這些線程,重複此過程
CyclicBarrier barrier = new CyclicBarrier(20, () -> System.out.println("滿人"));
for(int i=0; i<100; i++) {
new Thread(()->{
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
1.數據庫
2.網絡
3.文件
三個操作併發執行 執行完再繼續
phase
ReadWriteLock
Semaphore
//允許一個線程同時執行
//Semaphore s = new Semaphore(1);
new Thread(()->{
try {
s.acquire();
System.out.println("T1 running...");
Thread.sleep(200);
System.out.println("T1 running...");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
s.release();
}
}).start();
LockSupport
LockSupport.park()
LockSupport.unpark()