join()方法:相当于把t1加入到当前线程,并且等t1执行完再开始t2.
yield()方法: yield可以直接用Thread类调用,yield让出CPU执行权给同等级的线程,进入就绪状态,如果没有相同级别的线程在等待CPU的执行权,则该线程继续执行。
wait()方法:只能使用在被synchronized修饰的Critical Section(同步方法或同步代码块)中。当线程执行到该方法,线程失去锁,到阻塞态。
sleep()和sleep(time)方法:由当前线程调用。调用时,线程休眠但是未失去锁和CPU的执行机会,进入"WAITING"或"TIMEED_WAITING"的状态。
notify()方法:提醒某个"BLOCKED"状态的线程去争夺锁。
notifyAll()方法:提醒所有"BLOCKED"状态的线程去争夺锁。
LockSupport.park()方法:
LockSupport.parkNanos()方法:
LockSupport.parkUntil()方法:
LockSupport.unpark()方法:
CountDownLatch:
- countDown()方法用于使计数器减一,其一般是执行任务的线程调用,
- await()方法则使调用该方法的线程处于等待状态,其一般是主线程调用
CyclicBarrier barrier = new CyclicBarrier(20);
syn锁,锁的是对象,实际锁的是对象头64bit里面的两个bit字节,还有锁升级。或者锁的是class,一个锁的对象一个锁的类
三个比较:(T02_AtomicVsSyncVsLongAdder)
static long count2 = 0L;用synchronized
static AtomicLong count1 = new AtomicLong(0L);// 因为用了无锁操作
static LongAdder count3 = new LongAdder(); increment()方法 (这里用的分段锁) 各个数组的和为结果。也是CAS操作
1、synchronized:
代码见:JUC_T01_ReentrantLock1
特点:
独占锁,易于操作,但是不够灵活。
可重入,自动加锁和解锁。
- 不可响应中断。
2、ReentrantLock:不可重入锁
特点:
- 独占锁,解锁和解锁需要手动进行
- 可重入,但是必须加锁之后解锁。
- 可以响应中断:lock.lockInterruptibly();
- 可以实现公平锁(就是在锁上等待时间最长的线程将获得锁的使用权。通俗的理解就是谁排队时间最长谁先执行获取锁。)
尝试锁:ReentrantLock
代码见:JUC_T03_ReentrantLock3
如果没有拿到就会去执行别的线程,如果拿到了就等待执行完了再去执行别的线程。
Lock lock = new ReentrantLock();
locked = lock.tryLock(5, TimeUnit.SECONDS);
if(locked) lock.unlock();
可以被打断的锁:ReentrantLock
代码见:JUC_T04_ReentrantLock4
Lock lock = new ReentrantLock();
lock.lockInterruptibly(); //可以对interrupt()方法做出响应
lock.unlock();
t2.interrupt(); //打断线程2的等待
公平锁:ReentrantLock
代码见:JUC_T04_ReentrantLock5
private static ReentrantLock lock=new ReentrantLock(true); //默认是false,非公平锁 参数为true表示为公平锁(队列),请对比输出结果,默认为非公平锁.先去看队列里面有没有线程,没有直接执行,有的话先执行队列的线程。 lock.lock(); lock.unlock();
CountDownLatch:
Thread[] threads = new Thread[100];
CountDownLatch latch = new CountDownLatch(threads.length);
latch.countDown();
latch.await();
CyclicBarrier:等到到期下执行。
// 这里的20指定await等待多少线程之后开始执行。
CyclicBarrier barrier = new CyclicBarrier(20);
// 等待,后面指定的数据满了之后就发车
barrier.await();
CyclicBarrier barrier = new CyclicBarrier(20, new Runnable() {
@Override
public void run() {
System.out.println("满人,发车");
}
});
上面等于:
CyclicBarrier barrier = new CyclicBarrier(20, () -> System.out.println("满人"));
应用场景:
复杂操作,1、数据库 2、网络 3、文件
并发执行:不同的线程执行不同的操作。
ReadWriteLock读写锁:T10_TestReadWriteLock
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 单独拿到读锁
static Lock readLock = readWriteLock.readLock();
// 单独拿到写锁
static Lock writeLock = readWriteLock.writeLock();
readWriteLock.lock();
readWriteLock.unlock();
扩展:
MarriagePhaser: 分段锁。T09_TestPhaser2
MarriagePhaser phaser = new MarriagePhaser();
// 指明执行多少次
phaser.bulkRegister(7);
phaser.arriveAndAwaitAdvance();
phaser.arriveAndDeregister();// 结束线程。注销了-1
phaser.register();//把当前线程加进去+1
还要重写boolean onAdvance(int phase, int registe
Semaphore :限流
//Semaphore s = new Semaphore(2);
// 写几个就是说明几个同时可以执行。true是公平锁,false为不公平锁
Semaphore s = new Semaphore(1, true);
// -1。从Semaphore获取锁
s.acquire(); // 从Semaphore 获得一个锁
// +1从Semaphore释放锁
s.release();
Exchanger:两个线程交换。游戏里面交换装备??
// 只能两个线程之间交换
static Exchanger<String> exchanger = new Exchanger<>();
s = exchanger.exchange(s);
LockSupport:停止线程,不需要锁
// 当前线程阻塞。
LockSupport.park();
// 继续往前运行
LockSupport.unpark(t);