同步方法和同步块
发布日期:2021-05-08 02:59:34 浏览次数:20 分类:精选文章

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

Java多线程环境下,由于没有机制保证线程的原子性,可能会导致资源竞争问题。例如在抢票场景中,若多个线程同时操作票务系统,可能会导致票数出现负值,或者钱包中的金额出现负数等异常现象。这种现象表明,Java中的多线程编程需要额外的机制来确保线程的安全性。

解决这一问题的关键在于Java提供的锁机制。锁机制可以确保在多个线程同时访问共享资源时,能够按照一定的规则进行访问,避免数据竞争和资源泄漏等问题。在Java中,锁机制可以通过synchronized关键字来实现。具体来说,synchronized可以锁定当前类(使用public后加上synchronized),或者锁定特定对象(如synchronized(对象){代码块})。前者锁定的是类的所有方法,后者则只锁定特定对象的方法,能够更精确地控制资源的访问。

以下是一个典型的票务系统案例,展示了多线程环境下如何通过锁机制解决抢票问题:

public class UnsafeBuyTicket {
public static void main(String[] args) {
MyTicket myTicket = new MyTicket();
new Thread(myTicket, "用户1").start();
new Thread(myTicket, "用户2").start();
new Thread(myTicket, "用户3").start();
}
}
class MyTicket implements Runnable {
private int tickets = 10;
boolean flag = true;
@Override
public void run() {
while (flag) {
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 同步方法锁定this对象
private synchronized void buy() throws InterruptedException {
while (flag) {
if (tickets <= 0) {
flag = false;
return;
}
// 模拟延时
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "抢到了第" + tickets-- + "张票");
}
}
}
上一篇:JUC中安全类集合CopyOnWriteArrayList
下一篇:线程同步机制和三个线程不安全例子

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月05日 05时55分23秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章