线程安全问题的解决方式

        当我们在用多个线程操作共享资源的的时候,就会出现线程安全问题,在java中我们可以通过以下方法来解决线程安全问题.

比如比较经典的买票问题,三个窗口一起卖100张票

问题:在买票的过程中会出现重票,错票

原因:当某个线程在操作车票的时候,其他的线程也参与进来

解决:让一个线程在执行操作车票的时候,不让其他线程参与进来

解决方式一:同步代码块(synchronized)

 代码实现

                                               ①这个是实现Runnable去卖票

 

②这个是继承Thread实现的卖票

 

 

 解决方式二:同步方法(synchronized)

如果操作的共享数据的代码完整的声明在一个方法中,我们不妨将该方法声明为synchronized的

1.同步的方法仍然涉及到同步监视器,只不过不需要我们显示声明

2.非静态的同步方法,同步监视器是:this

   静态的同步方法:同步监视器是:当前类的本省

代码实现

①这个是实现Runnable卖票

         这里是将要线程执行的操作写进一个show()里,用synchronized去修饰该方法,然后在run()中去调用.

②这个是继承Thread实现的卖票

 解决方式三:Lock锁

       步骤:1.在实现类里去实例化一个lock

                2.在操作共享数据前去调用lock()去锁定

                3.结束后还要去调用unlock()解锁  

代码实现

 这三种方法的优先级

lock  -->  同步代码块(已经进入方法体,分配了相应的资源)  -->  同步方法

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值