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()