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