多线程同步

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、教学导入

复习线程的生命周期及状态转换的概念,

✧引入新课。

生活中的事例1:购买火车票,两个人同时买最后一张火车票;

生活中的事例2:支付款项,支付业务可以在不同的地方同时进行。

✧以上会发生线程安全问题,引入多线程同步问题。

二、讲授新课

1.线程安全问题

模拟窗口售票程序,售票的动作需要同时执行,所以使用多线程技术。假如共有100张票出售,并在售票的代码中每次售票时线程休眠10毫秒,如下所示 Example1.java。

public class Example11 {

public static void main(String[] args) {

// 创建Ticket1 对象

SaleThreadsaleThread = new SaleThread();

// 创建并开启四个线程

new Thread(saleThread, "线程一").start();

new Thread(saleThread, "线程二").start();

new Thread(saleThread, "线程三").start();

new Thread(saleThread, "线程四").start();

}

}

// 定义Ticket1类实现Runnable接口

class SaleThread implements Runnable {

//1,描述票的数量。

private int tickets = 100; // 100张票

//2,售票的动作,这个动作需要被多线程执行,那就是线程任务代码。需要定义run方法中。

//线程任务中通常都有循环结构。

public void run() {

while (tickets > 0) {

try {

Thread.sleep(10); //要让线程在这里稍停,模拟问题的发生。sleep 看到了0 -1 -2 错误的数据,这就是传说中的多线程安全问题。经过此处的线程休眠10毫秒

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + "---卖出的票"+ tickets--);//打印线程名称

}

}

}

运行结果如下图所示。

从上图可以看出,售出的票出现了0、-1、-2这样的票号,这种现象是不应该出现的,因此,上面的多线程程序存在安全问题。

【问题产生的原因】

1,线程任务中在操作共享的数据。

2,线程任务操作共享数据的代码有多条(运算有多个)。

【解决思路】

3.同步方法

相关文档
最新文档