多线程同步
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.同步方法