JUC-多线程锁-公平锁和非公平锁

package com.nanjing.juc;

import java.util.concurrent.locks.ReentrantLock;

class LockTicket{
    //票的数量
    private int number = 100;
    //创建可重入锁
    private final ReentrantLock lock = new ReentrantLock();
    //操作方法:卖票
    public void sale(){
        //上锁
        lock.lock();
        //判断是否有票
        try {
            if(number > 0){
                System.out.println(Thread.currentThread().getName()+" :卖出:"+(number--)+" 剩下:"+number);
            }
        } finally {
            //解锁
            lock.unlock();
        }

    }
}

public class LockSaleTicket_03 {
    //创建多个线程,调用资源类的操作方法
    public static void main(String[] args) {
        //创建LockTicket对象
        LockTicket lockTicket = new LockTicket();
        //创建三个线程
        /*new Thread(new Runnable() {
            @Override
            public void run() {
                //调用卖票的方法
                for (int i = 0; i < 300; i++) {
                    ticket.sale();
                }
            }
        },"刘德华").start();*/

        //lambda写法
        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                lockTicket.sale();
            }
        },"刘德华").start();

        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                lockTicket.sale();
            }
        },"张学友").start();

        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                lockTicket.sale();
            }
        },"黎明").start();

    }
}

第一次执行: 

刘德华 :卖出:100 剩下:99
刘德华 :卖出:99 剩下:98
刘德华 :卖出:98 剩下:97
刘德华 :卖出:97 剩下:96
刘德华 :卖出:96 剩下:95
刘德华 :卖出:95 剩下:94
刘德华 :卖出:94 剩下:93
刘德华 :卖出:93 剩下:92
刘德华 :卖出:92 剩下:91
刘德华 :卖出:91 剩下:90
刘德华 :卖出:90 剩下:89
刘德华 :卖出:89 剩下:88
刘德华 :卖出:88 剩下:87
刘德华 :卖出:87 剩下:86
刘德华 :卖出:86 剩下:85
刘德华 :卖出:85 剩下:84
刘德华 :卖出:84 剩下:83
刘德华 :卖出:83 剩下:82
刘德华 :卖出:82 剩下:81
刘德华 :卖出:81 剩下:80
刘德华 :卖出:80 剩下:79
刘德华 :卖出:79 剩下:78
刘德华 :卖出:78 剩下:77
刘德华 :卖出:77 剩下:76
刘德华 :卖出:76 剩下:75
刘德华 :卖出:75 剩下:74
刘德华 :卖出:74 剩下:73
刘德华 :卖出:73 剩下:72
刘德华 :卖出:72 剩下:71
刘德华 :卖出:71 剩下:70
刘德华 :卖出:70 剩下:69
刘德华 :卖出:69 剩下:68
刘德华 :卖出:68 剩下:67
刘德华 :卖出:67 剩下:66
刘德华 :卖出:66 剩下:65
刘德华 :卖出:65 剩下:64
刘德华 :卖出:64 剩下:63
刘德华 :卖出:63 剩下:62
刘德华 :卖出:62 剩下:61
刘德华 :卖出:61 剩下:60
刘德华 :卖出:60 剩下:59
刘德华 :卖出:59 剩下:58
刘德华 :卖出:58 剩下:57
刘德华 :卖出:57 剩下:56
刘德华 :卖出:56 剩下:55
刘德华 :卖出:55 剩下:54
刘德华 :卖出:54 剩下:53
刘德华 :卖出:53 剩下:52
刘德华 :卖出:52 剩下:51
刘德华 :卖出:51 剩下:50
刘德华 :卖出:50 剩下:49
刘德华 :卖出:49 剩下:48
刘德华 :卖出:48 剩下:47
刘德华 :卖出:47 剩下:46
刘德华 :卖出:46 剩下:45
刘德华 :卖出:45 剩下:44
刘德华 :卖出:44 剩下:43
刘德华 :卖出:43 剩下:42
刘德华 :卖出:42 剩下:41
刘德华 :卖出:41 剩下:40
刘德华 :卖出:40 剩下:39
刘德华 :卖出:39 剩下:38
刘德华 :卖出:38 剩下:37
刘德华 :卖出:37 剩下:36
刘德华 :卖出:36 剩下:35
刘德华 :卖出:35 剩下:34
刘德华 :卖出:34 剩下:33
刘德华 :卖出:33 剩下:32
刘德华 :卖出:32 剩下:31
刘德华 :卖出:31 剩下:30
刘德华 :卖出:30 剩下:29
刘德华 :卖出:29 剩下:28
刘德华 :卖出:28 剩下:27
刘德华 :卖出:27 剩下:26
刘德华 :卖出:26 剩下:25
刘德华 :卖出:25 剩下:24
刘德华 :卖出:24 剩下:23
刘德华 :卖出:23 剩下:22
刘德华 :卖出:22 剩下:21
刘德华 :卖出:21 剩下:20
刘德华 :卖出:20 剩下:19
刘德华 :卖出:19 剩下:18
刘德华 :卖出:18 剩下:17
刘德华 :卖出:17 剩下:16
刘德华 :卖出:16 剩下:15
刘德华 :卖出:15 剩下:14
刘德华 :卖出:14 剩下:13
刘德华 :卖出:13 剩下:12
刘德华 :卖出:12 剩下:11
刘德华 :卖出:11 剩下:10
刘德华 :卖出:10 剩下:9
刘德华 :卖出:9 剩下:8
刘德华 :卖出:8 剩下:7
刘德华 :卖出:7 剩下:6
刘德华 :卖出:6 剩下:5
刘德华 :卖出:5 剩下:4
刘德华 :卖出:4 剩下:3
刘德华 :卖出:3 剩下:2
刘德华 :卖出:2 剩下:1
刘德华 :卖出:1 剩下:0

都被线程刘德华一个人消费了,其他线程饿死了

第二次执行:

刘德华 :卖出:100 剩下:99
黎明 :卖出:99 剩下:98
黎明 :卖出:98 剩下:97
黎明 :卖出:97 剩下:96
黎明 :卖出:96 剩下:95
黎明 :卖出:95 剩下:94
黎明 :卖出:94 剩下:93
黎明 :卖出:93 剩下:92
黎明 :卖出:92 剩下:91
黎明 :卖出:91 剩下:90
黎明 :卖出:90 剩下:89
黎明 :卖出:89 剩下:88
黎明 :卖出:88 剩下:87
黎明 :卖出:87 剩下:86
黎明 :卖出:86 剩下:85
黎明 :卖出:85 剩下:84
黎明 :卖出:84 剩下:83
黎明 :卖出:83 剩下:82
黎明 :卖出:82 剩下:81
黎明 :卖出:81 剩下:80
黎明 :卖出:80 剩下:79
黎明 :卖出:79 剩下:78
黎明 :卖出:78 剩下:77
黎明 :卖出:77 剩下:76
黎明 :卖出:76 剩下:75
黎明 :卖出:75 剩下:74
黎明 :卖出:74 剩下:73
黎明 :卖出:73 剩下:72
黎明 :卖出:72 剩下:71
黎明 :卖出:71 剩下:70
黎明 :卖出:70 剩下:69
黎明 :卖出:69 剩下:68
黎明 :卖出:68 剩下:67
黎明 :卖出:67 剩下:66
黎明 :卖出:66 剩下:65
黎明 :卖出:65 剩下:64
黎明 :卖出:64 剩下:63
黎明 :卖出:63 剩下:62
黎明 :卖出:62 剩下:61
黎明 :卖出:61 剩下:60
黎明 :卖出:60 剩下:59
黎明 :卖出:59 剩下:58
黎明 :卖出:58 剩下:57
黎明 :卖出:57 剩下:56
黎明 :卖出:56 剩下:55
黎明 :卖出:55 剩下:54
黎明 :卖出:54 剩下:53
黎明 :卖出:53 剩下:52
黎明 :卖出:52 剩下:51
黎明 :卖出:51 剩下:50
黎明 :卖出:50 剩下:49
黎明 :卖出:49 剩下:48
黎明 :卖出:48 剩下:47
黎明 :卖出:47 剩下:46
黎明 :卖出:46 剩下:45
黎明 :卖出:45 剩下:44
黎明 :卖出:44 剩下:43
黎明 :卖出:43 剩下:42
黎明 :卖出:42 剩下:41
黎明 :卖出:41 剩下:40
黎明 :卖出:40 剩下:39
黎明 :卖出:39 剩下:38
黎明 :卖出:38 剩下:37
黎明 :卖出:37 剩下:36
黎明 :卖出:36 剩下:35
黎明 :卖出:35 剩下:34
黎明 :卖出:34 剩下:33
黎明 :卖出:33 剩下:32
黎明 :卖出:32 剩下:31
黎明 :卖出:31 剩下:30
黎明 :卖出:30 剩下:29
黎明 :卖出:29 剩下:28
黎明 :卖出:28 剩下:27
黎明 :卖出:27 剩下:26
黎明 :卖出:26 剩下:25
黎明 :卖出:25 剩下:24
黎明 :卖出:24 剩下:23
张学友 :卖出:23 剩下:22
张学友 :卖出:22 剩下:21
张学友 :卖出:21 剩下:20
张学友 :卖出:20 剩下:19
张学友 :卖出:19 剩下:18
张学友 :卖出:18 剩下:17
张学友 :卖出:17 剩下:16
张学友 :卖出:16 剩下:15
张学友 :卖出:15 剩下:14
张学友 :卖出:14 剩下:13
张学友 :卖出:13 剩下:12
张学友 :卖出:12 剩下:11
张学友 :卖出:11 剩下:10
张学友 :卖出:10 剩下:9
刘德华 :卖出:9 剩下:8
刘德华 :卖出:8 剩下:7
刘德华 :卖出:7 剩下:6
刘德华 :卖出:6 剩下:5
刘德华 :卖出:5 剩下:4
黎明 :卖出:4 剩下:3
黎明 :卖出:3 剩下:2
黎明 :卖出:2 剩下:1
黎明 :卖出:1 剩下:0

线程之前抢,存在插队的问题

公平锁非公平锁的实际使用_并发编程实战06:公平锁和非公平锁_weixin_39789094的博客-优快云博客

ReentrantLock默认是非公平锁,不需要排队,线程之间互相抢

源码:

非公平锁缺少了一个hasQueuedPredecessors的判断。这个方法就是判断在等待队列中是否已经

有线程在排队了。这也就是公平锁和非公平锁的核心区别,如果是公平锁,那么一旦已经有线程在

排队了,当前线程就不再尝试获取锁;对于非公平锁而言,无论是否已经有线程在排队,都会尝试

获取一下锁,获取不到的话,再去排队。 


我们改成公平锁,多加点票的数量

package com.nanjing.juc;

import java.util.concurrent.locks.ReentrantLock;

class LockTicket{
    //票的数量
    private int number = 100;
    //创建可重入锁
    private final ReentrantLock lock = new ReentrantLock(true);
    //操作方法:卖票
    public void sale(){
        //上锁
        lock.lock();
        //判断是否有票
        try {
            if(number > 0){
                System.out.println(Thread.currentThread().getName()+" :卖出:"+(number--)+" 剩下:"+number);
            }
        } finally {
            //解锁
            lock.unlock();
        }

    }
}

public class LockSaleTicket_03 {
    //创建多个线程,调用资源类的操作方法
    public static void main(String[] args) {
        //创建LockTicket对象
        LockTicket lockTicket = new LockTicket();
        //创建三个线程
        /*new Thread(new Runnable() {
            @Override
            public void run() {
                //调用卖票的方法
                for (int i = 0; i < 300; i++) {
                    ticket.sale();
                }
            }
        },"刘德华").start();*/

        //lambda写法
        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                lockTicket.sale();
            }
        },"刘德华").start();

        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                lockTicket.sale();
            }
        },"张学友").start();

        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                lockTicket.sale();
            }
        },"黎明").start();

    }
}
刘德华 :卖出:100 剩下:99
刘德华 :卖出:99 剩下:98
刘德华 :卖出:98 剩下:97
刘德华 :卖出:97 剩下:96
刘德华 :卖出:96 剩下:95
刘德华 :卖出:95 剩下:94
刘德华 :卖出:94 剩下:93
刘德华 :卖出:93 剩下:92
刘德华 :卖出:92 剩下:91
刘德华 :卖出:91 剩下:90
刘德华 :卖出:90 剩下:89
刘德华 :卖出:89 剩下:88
刘德华 :卖出:88 剩下:87
刘德华 :卖出:87 剩下:86
刘德华 :卖出:86 剩下:85
刘德华 :卖出:85 剩下:84
刘德华 :卖出:84 剩下:83
刘德华 :卖出:83 剩下:82
刘德华 :卖出:82 剩下:81
张学友 :卖出:81 剩下:80
黎明 :卖出:80 剩下:79
刘德华 :卖出:79 剩下:78
张学友 :卖出:78 剩下:77
黎明 :卖出:77 剩下:76
刘德华 :卖出:76 剩下:75
张学友 :卖出:75 剩下:74
黎明 :卖出:74 剩下:73
刘德华 :卖出:73 剩下:72
张学友 :卖出:72 剩下:71
黎明 :卖出:71 剩下:70
刘德华 :卖出:70 剩下:69
张学友 :卖出:69 剩下:68
黎明 :卖出:68 剩下:67
刘德华 :卖出:67 剩下:66
张学友 :卖出:66 剩下:65
黎明 :卖出:65 剩下:64
刘德华 :卖出:64 剩下:63
张学友 :卖出:63 剩下:62
黎明 :卖出:62 剩下:61
刘德华 :卖出:61 剩下:60
张学友 :卖出:60 剩下:59
黎明 :卖出:59 剩下:58
刘德华 :卖出:58 剩下:57
张学友 :卖出:57 剩下:56
黎明 :卖出:56 剩下:55
刘德华 :卖出:55 剩下:54
张学友 :卖出:54 剩下:53
黎明 :卖出:53 剩下:52
刘德华 :卖出:52 剩下:51
张学友 :卖出:51 剩下:50
黎明 :卖出:50 剩下:49
刘德华 :卖出:49 剩下:48
张学友 :卖出:48 剩下:47
黎明 :卖出:47 剩下:46
刘德华 :卖出:46 剩下:45
张学友 :卖出:45 剩下:44
黎明 :卖出:44 剩下:43
刘德华 :卖出:43 剩下:42
张学友 :卖出:42 剩下:41
黎明 :卖出:41 剩下:40
刘德华 :卖出:40 剩下:39
张学友 :卖出:39 剩下:38
黎明 :卖出:38 剩下:37
刘德华 :卖出:37 剩下:36
张学友 :卖出:36 剩下:35
黎明 :卖出:35 剩下:34
刘德华 :卖出:34 剩下:33
张学友 :卖出:33 剩下:32
黎明 :卖出:32 剩下:31
刘德华 :卖出:31 剩下:30
张学友 :卖出:30 剩下:29
黎明 :卖出:29 剩下:28
刘德华 :卖出:28 剩下:27
张学友 :卖出:27 剩下:26
黎明 :卖出:26 剩下:25
刘德华 :卖出:25 剩下:24
张学友 :卖出:24 剩下:23
黎明 :卖出:23 剩下:22
刘德华 :卖出:22 剩下:21
张学友 :卖出:21 剩下:20
黎明 :卖出:20 剩下:19
刘德华 :卖出:19 剩下:18
张学友 :卖出:18 剩下:17
黎明 :卖出:17 剩下:16
刘德华 :卖出:16 剩下:15
张学友 :卖出:15 剩下:14
黎明 :卖出:14 剩下:13
刘德华 :卖出:13 剩下:12
张学友 :卖出:12 剩下:11
黎明 :卖出:11 剩下:10
刘德华 :卖出:10 剩下:9
张学友 :卖出:9 剩下:8
黎明 :卖出:8 剩下:7
刘德华 :卖出:7 剩下:6
张学友 :卖出:6 剩下:5
黎明 :卖出:5 剩下:4
刘德华 :卖出:4 剩下:3
张学友 :卖出:3 剩下:2
黎明 :卖出:2 剩下:1
刘德华 :卖出:1 剩下:0

 线程直接获取锁的顺序是完全公平的,先到先得

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZHOU_VIP

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

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

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

打赏作者

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

抵扣说明:

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

余额充值