java基础--24.多线程的应用--电影院卖票程序的实现
Posted 大数据小小罗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础--24.多线程的应用--电影院卖票程序的实现相关的知识,希望对你有一定的参考价值。
A.多线程应用–电影院卖票程序的实现
A:继承Thread类
B:实现Runnable接口
电影院卖票程序出问题
为了更符合真实的场景,加入了休眠100毫秒。
多线程卖票过程中可能出现的问题:
a:同一张票多次出售
CPU的一次操作必须是原子性的
b:负数票
随机性和延迟导致
多线程安全问题产生的原因(也是我们以后判断一个程序是否有线程安全问题的依据)
A:是否有多线程环境 有!
B:是否有共享数据 有!
C:是否有多条语句操作共享数据 有!
B.同步解决线程安全问题
1.同步代码块
synchronized(对象)
需要被同步的代码;
这里的锁对象可以是任意对象,多个线程同时持有的必须是同一把锁(同一个对象)。
2.同步方法
把同步加在方法上。
这里的锁对象是 this
3.静态同步方法
把同步加在静态方法上。
静态方法的锁对象是:当前类的字节码文件对象
同步的特点
- 前提:多个线程
- 解决问题的时候需要注意:多个线程使用的是同一个锁对象
- 同步的好处:同步的出现解决了多线程的安全问题
- 同步的弊端:当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率
回顾以前的线程安全的类
A:StringBuffer
B:Vector
C:Hashtable
线程安全的类,效率都比较低
D:如何把一个线程不安全的集合类变成一个线程安全的集合类?
用Collections工具类的方法即可。
举例:
List<String> list1 = new ArrayList<String>(); //线程不安全
List<String> list2 = Collections
.synchronizedList(new ArrayList<String>()); //线程安全
以上是关于java基础--24.多线程的应用--电影院卖票程序的实现的主要内容,如果未能解决你的问题,请参考以下文章