锁绑定多个条件Condition

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/longgeqiaojie304/article/details/91409831

锁绑定多个条件Condition

大厂面试题:

我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案?

公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。

CountDownLatch、CyclicBarrier、Semaphore使用过吗?

阻塞队列知道吗?

线程池用过吗?ThreadPoolExecutor谈谈你的理解?

线程池用过吗?生产上你是如何设置合理参数?

死锁编码及定位分析?

锁绑定多个条件Condition代码验证

package com.wwl.juc;

 

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

 

/**

 * 共享资源类

 */

class ShareResource {

    // A:1 B:2 C:30

    private int num = 1;

    private Lock lock = new ReentrantLock();

    private Condition conditionA = lock.newCondition();

    private Condition conditionB = lock.newCondition();

    private Condition conditionC = lock.newCondition();

 

    // 循环打印5次

    public void print5() {

        // 1、获取锁资源

        lock.lock();

        try {

            // 2、判断是否可以执行业务

            while (num != 1) {

                conditionA.await();

            }

            // 模拟业务执行

            for (int i = 0; i < 5; i++) {

                System.out.println(Thread.currentThread().getName() + "\t" + (i+1));

            }

            // 3、通知其他线程

            num = 2;

            conditionB.signal();

        } catch (InterruptedException e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

 

    // 循环打印10次

    public void print10() {

        // 1、获取锁资源

        lock.lock();

        try {

            // 2、判断是否可以执行业务

            while (num != 2) {

                conditionB.await();

            }

            // 模拟业务执行

            for (int i = 0; i < 10; i++) {

                System.out.println(Thread.currentThread().getName() + "\t" + (i+1));

            }

            // 3、通知其他线程

            num = 3;

            conditionC.signal();

        } catch (InterruptedException e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

 

    // 循环打印15次

    public void print15() {

        // 1、获取锁资源

        lock.lock();

        try {

            // 2、判断是否可以执行业务

            while (num != 3) {

                conditionC.await();

            }

            // 模拟业务执行

            for (int i = 0; i < 15; i++) {

                System.out.println(Thread.currentThread().getName() + "\t" + (i+1));

            }

            // 3、通知其他线程

            num = 1;

            conditionA.signal();

        } catch (InterruptedException e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

 

}

 

/**

 * 锁绑定多个条件Condition

 * 题目:多线程之间按顺序执行,实现A->B->C三个线程启动,要求如下:

 *      A打印5次,B打印10次,C打印15次,

 *      紧接着

 *      A打印5次,B打印10次,C打印15次,

 *      .

 *      .

 *      .

 *      循环执行10轮

 */

public class LockConditionDemo {

    public static void main(String[] args) {

        ShareResource shareResource = new ShareResource();

        new Thread(()->{

            for(int i = 0; i < 10; i++){

                shareResource.print5();

            }

        },"A").start();

 

        new Thread(()->{

            for(int i = 0; i < 10; i++){

                shareResource.print10();

            }

        },"B").start();

 

        new Thread(()->{

            for(int i = 0; i < 10; i++){

                shareResource.print15();

            }

        },"C").start();

    }

}

程序执行结果如下:

Connected to the target VM, address: '127.0.0.1:52817', transport: 'socket'

A     1

A     2

A     3

A     4

A     5

B     1

B     2

B     3

B     4

B     5

B     6

B     7

B     8

B     9

B     10

C     1

C     2

C     3

C     4

C     5

C     6

C     7

C     8

C     9

C     10

C     11

C     12

C     13

C     14

C     15

A     1

A     2

A     3

A     4

A     5

B     1

B     2

B     3

B     4

B     5

B     6

B     7

B     8

B     9

B     10

C     1

C     2

C     3

C     4

C     5

C     6

C     7

C     8

C     9

C     10

C     11

C     12

C     13

C     14

C     15

A     1

A     2

A     3

A     4

A     5

B     1

B     2

B     3

B     4

B     5

B     6

B     7

B     8

B     9

B     10

C     1

C     2

C     3

C     4

C     5

C     6

C     7

C     8

C     9

C     10

C     11

C     12

C     13

C     14

C     15

A     1

A     2

A     3

A     4

A     5

B     1

B     2

B     3

B     4

B     5

B     6

B     7

B     8

B     9

B     10

C     1

C     2

C     3

C     4

C     5

C     6

C     7

C     8

C     9

C     10

C     11

C     12

C     13

C     14

C     15

.

.

.

.

.

.

猜你喜欢

转载自blog.csdn.net/longgeqiaojie304/article/details/91409831