JUC筆記1

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章