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>()); //线程安全
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值