博客
关于我
java线程(17)——Lock锁,三个线程抢票加上lock锁后变成三个线程排队买票
阅读量:322 次
发布时间:2019-03-04

本文共 1972 字,大约阅读时间需要 6 分钟。

多线程抢票问题及Lock锁的应用

1. 线程抢票问题

传统的多线程票务系统可能会出现线程安全问题,尤其是在多个线程同时操作共享资源时。例如,三个线程同时抢票可能导致票数重复售出或票数异常减少等问题。

不安全的代码示例

public class TestLock {
public static void main(String[] args) {
TestLock2 testLock2 = new TestLock2();
new Thread(testLock2).start();
new Thread(testLock2).start();
new Thread(testLock2).start();
}
}
class TestLock2 implements Runnable {
int ticketNums = 10;
@Override
public void run() {
while (true) {
if (ticketNums > 0) {
Thread.sleep(1000);
System.out.println(ticketNums--);
} else {
break;
}
}
}
}

运行结果示例

运行时可能会出现以下问题:

  • 同一个票可能被多个线程同时抢购
  • 票数可能会异常减少
  • 2. 使用Lock锁解决问题

    通过引入ReentrantLock锁,可以有效防止线程抢票问题。以下是改进后的代码:

    import java.util.concurrent.locks.ReentrantLock;
    public class TestLock {
    public static void main(String[] args) {
    TestLock2 testLock2 = new TestLock2();
    new Thread(testLock2).start();
    new Thread(testLock2).start();
    new Thread(testLock2).start();
    }
    }
    class TestLock2 implements Runnable {
    int ticketNums = 10;
    private final ReentrantLock lock = new ReentrantLock();
    @Override
    public void run() {
    while (true) {
    lock.lock();
    try {
    if (ticketNums > 0) {
    Thread.sleep(1000);
    System.out.println(ticketNums--);
    } else {
    break;
    }
    } finally {
    lock.unlock();
    }
    }
    }
    }

    改进后的运行结果

  • 每个线程将独占性地持有锁,确保票数正确递减
  • 票数将按顺序递减,避免重复售出
  • 系统运行更加稳定,线程安全得到了有效保障
  • 3. Lock锁与synchronized的对比

    主要区别

  • 锁的类型

    • Lock锁是显示锁,需要手动开启和关闭锁
    • synchronized是隐式锁,自动释放锁定状态
  • 锁的应用场景

    • Lock锁提供更细粒度的锁控制,可以灵活配置锁定区域
    • synchronized的锁定范围更大,通常用于方法或代码块层面的资源保护
  • 性能特点

    • Lock锁的锁解锁操作由用户手动控制,JVM调度线程时更高效
    • synchronized的锁解锁操作由JVM自动处理,性能相对较低
  • 选择建议

    在多线程环境下,建议根据具体需求选择合适的锁机制:

    • 如果需要细粒度的资源控制,Lock锁是一个更好的选择
    • 如果需要快速实现线程安全,synchronized提供了一个简洁的解决方案

    转载地址:http://zseq.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现numerical integration数值积分算法(附完整源码)
    查看>>
    Objective-C实现n皇后问题算法(附完整源码)
    查看>>
    Objective-C实现O(E + V) 中找到 0-1-graph 中的最短路径算法(附完整源码)
    查看>>
    Objective-C实现OCR文字识别(附完整源码)
    查看>>
    Objective-C实现odd even sort奇偶排序算法(附完整源码)
    查看>>
    Objective-C实现ohms law欧姆定律算法(附完整源码)
    查看>>
    Objective-C实现P-Series algorithm算法(附完整源码)
    查看>>
    Objective-C实现page rank算法(附完整源码)
    查看>>
    Objective-C实现PageRank算法(附完整源码)
    查看>>
    Objective-C实现pancake sort煎饼排序算法(附完整源码)
    查看>>
    Objective-C实现pascalTriangle帕斯卡三角形算法(附完整源码)
    查看>>
    Objective-C实现patience sort耐心排序算法(附完整源码)
    查看>>
    Objective-C实现PCA(附完整源码)
    查看>>
    Objective-C实现perceptron算法(附完整源码)
    查看>>
    Objective-C实现perfect cube完全立方数算法(附完整源码)
    查看>>
    Objective-C实现perfect number完全数算法(附完整源码)
    查看>>
    Objective-C实现perfect square完全平方数算法(附完整源码)
    查看>>
    Objective-C实现permutate Without Repetitions无重复排列算法(附完整源码)
    查看>>
    Objective-C实现PNG图片格式转换BMP图片格式(附完整源码)
    查看>>
    Objective-C实现pollard rho大数分解算法(附完整源码)
    查看>>