java 并发编程 卖票_Java并发编程-常见问题

一、常见问题

从小的方面讲, 并发编程最常见的问题就是可见性、原子性和有序性问题。

从大的方面讲, 并发编程最常见的问题就是安全性问题、活跃性问题和性能问题。

下面主要从微观上分析问题。

二、可见性问题

可见性:一个线程对共享变量的修改,另外一个线程能够立马看到,这个称之为可见性。知道了可见性那么你就知道可见性问题了.

可见性问题:一个线程对共享变量的修改,但另一个线程感知不到其修改值的操作,读取的还是原来的值,这样会引起数据紊乱。

场景案例分析:以我们现实生活中为例,比如电影院卖票系统,假设一个电影院的座位有10000张,此时有两个影迷(同时)过来分别各买了5000张电影票,那么它还剩多少余票呢?下面我们看下代码实现:

public classVisibilityProblemTest {/*** 电影票总数*/

private int movieTicketAmount = 10000;/*** 售票*/

public void saleTicket(intn) {/*** 为了让问题能够明显一点,使用减1的操作,重复n次*/

int i = 0;while (i++

movieTicketAmount-= 1;

}

}/*** 返回剩余电影票

*@returnint*/

public intgetMovieTicketAmount() {returnmovieTicketAmount;

}public static void main(String[] args) throwsInterruptedException {final VisibilityProblemTest ticket = newVisibilityProblemTest();//假设现在有两个用户分别购买5000张电影票

Thread user1 = new Thread(() -> ticket.saleTicket(5000));

Thread user2= new Thread(() -> ticket.saleTicket(5000));

user1.start();

user2.start();//等待用户购买完成

user1.join();

user2.join();//售了10000张电影票后查验余数,理应还剩0张

System.out.println(ticket.getMovieTicketAmount());

Assert.assertEquals(ticket.getMovieTicketAmount(),0);

}

}

大家应该都猜到了,最终的余票不一定为0,有可能会大于0。因为其存在数据可见性问

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值