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.多线程的应用--电影院卖票程序的实现的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-基础-线程安全

java多线程(线程安全,线程同步)

java笔记线程两种方式模拟电影院卖票

Java多线程详解

多线程安全处理

Java 多线程安全问题简单切入详细解析