线程同步安全问题

假设我们要做一个购票系统。

那么首先,购票系统是由票数,购票,用户组成,并且同时会有多位用户进行购票。所以,先创建一个票装置类Ticket类,这个类只需有一个属性——票数(100张)。然后,就是用户购票的类,这个类则用到线程类——UserThread类,让它extends继承Thread类或implements Runnable接口类。

然后,在UserThread类中·,首先我们要定义一个Ticket类的属性,用来传递Ticket对象(更详细的说,获得票数信息),接着,直接用构造方法实现对象传递,即:

 接着,重写run方法,(——因为每个线程只能调用一次start方法,启动线程后run方法自动执行,run方法执行完线程即结束,且一旦结束不可再启动)所以run方法一般只调用一次,因此想让它不断操作,我们只需写一个循环,这次我们用for循环50次即可。再加上延时代码。

然后,由于多个用户同时购票,即多个线程同步进行,我们实现线程同步有两种方式。

在这之前,首先看若不使用同步线程,直接让两个用户购票出现的结果:

我们可以看到,A已经买到16号票,B却也买到了16号。所以要用线程同步。 

首先看第一种方式,同步代码块。

synchronized(监视器(对象锁)){
   需要同步的代码...
   }

这个监视器(对象锁):任何一个对象都可以作为监视器使用。但注意,需要同步的线程使用的线程必须是同一个监视器。打个比方,若有三个人共用一台车,若每个人都有钥匙,则在第一人使用时,其他人也能使用,会造成上述那样的局面。

比如,当我们extends Thread时,代码如下:

 由于我们设置的监听器是this,也就是当前UserThread类对象,而因为我们创建了A,B两个对象,导致使用的监听器不是同一个,所以结果错误。

解决方法之一就是implements Runnable接口类,这样就只创建了一次UserThread(创建两个Thread线程),如图:

 接下来是第二种方式,同步方法,注意,同步方法不能用extends继承thread来启动线程。

代码如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值