使用lock实现多线程并发访问

本文通过Java实现了一个使用ReentrantLock进行线程同步的售票系统示例,展示了如何利用锁机制来确保线程安全,防止多线程环境下出现资源竞争导致的数据不一致问题。

一.主类
​​​​

package com.ljf.thread.demo.lock;

public class LockDemo {
    public static void main(String args[]){
        LockA la=new LockA();
    new Thread(la,"a").start();
    new Thread(la,"b").start();
    new Thread(la,"c").start();
    }
}

package com.ljf.thread.demo.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockA implements Runnable{
    private int tickets=100;
    private Lock lock=new ReentrantLock();//公用一把锁
    public void run() {
        while (true){
            try {
                lock.lock();
                if(tickets>0){
                    System.out.println(Thread.currentThread().getName()+"消费:"+tickets--);
                }
                Thread.sleep(100);

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
}

执行结果:

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

都看到这里了,就顺手点击左上角的【关注】按钮,点击右上角的小手,给个评论,关注一下,再走呗!☺

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值