前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 多线程设计模式 —— Single Threaded Execution

Java 多线程设计模式 —— Single Threaded Execution

作者头像
一份执着✘
发布2020-10-09 11:16:17
6160
发布2020-10-09 11:16:17
举报
文章被收录于专栏:赵俊的Java专栏赵俊的Java专栏

简介

Single Threaded Execution 有时也会被称之为 临界区。表示 临界区 内的代码同一时间内只允许一个线程执行,这个模式是并发编程的基础,对应 Java 中也就是同步代码块 synchronized,或其他显式锁 lock

使用场景

  • 多线程环境
  • 多个线程同时访问的共享资源
  • 这些线程会改变共享资源。

示例

现有票 100 张,分三个窗口售卖,卖完为止。

票类:

代码语言:javascript
复制
public class Ticket {

    private int counter = 100;

    public void sell() {
        if (counter > 0) {
            System.out.println(Thread.currentThread().getName() + "号窗口卖出:" + this.counter-- + "号票");
        } else {
            System.out.println("票已卖完");
        }
    }

}

窗口类:

代码语言:javascript
复制
public class StationThread extends Thread {

    private final Ticket ticket;

    public StationThread(String name, Ticket ticket) {
        super(name);
        this.ticket = ticket;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            ticket.sell();
        }
    }
}

测试类:

代码语言:javascript
复制
public class Main {

    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new StationThread("S1", ticket).start();
        new StationThread("S2", ticket).start();
        new StationThread("S3", ticket).start();
    }
}

运行结果如下:

很明显的可以看到,同一张票,被多个窗口同时售卖了,就是因为未对共享资源 Ticket 做保护,导致了这种情况。

解决办法也很简单,给 Ticket 的 sell 方法加上 synchronized 即可。这样就防止了多个窗口同时访问同一张票。

代码语言:javascript
复制
public class Ticket {

    private int counter = 100;

    public synchronized void sell() {
        if (counter > 0) {
            System.out.println(Thread.currentThread().getName() + "号窗口卖出:" + this.counter-- + "号票");
        } else {
            System.out.println("票已卖完");
        }
    }

}

类图

时序图

总结

单线程的情况,不需要使用此模式,就好像一个人在家上厕所,不需要锁门一样。

只有当 多线程 同时对 同一个共享资源,在线程中 进行了修改,才需要使用此模式。

且需要注意,对于 共享资源,如果用到了此模式,要保证所有使用他的地方都进行了保护。不然等于你把门锁住了,但窗子没关。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 使用场景
  • 示例
  • 类图
  • 时序图
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档