【多线程高并发】3、多线程synchronized+ReentrantLock+CountDownLatch+CyclicBarrier+MarriagePhaser+Semaphore 等锁【草稿】

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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello-zhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值