java基础--24.多线程的应用--电影院卖票程序的实现

来源:互联网 发布:淘宝卖面膜怎么样 编辑:程序博客网 时间:2024/05/01 14:20

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>()); //线程安全
1 0
原创粉丝点击