当我们在用多个线程操作共享资源的的时候,就会出现线程安全问题,在java中我们可以通过以下方法来解决线程安全问题.
比如比较经典的买票问题,三个窗口一起卖100张票
问题:在买票的过程中会出现重票,错票
原因:当某个线程在操作车票的时候,其他的线程也参与进来
解决:让一个线程在执行操作车票的时候,不让其他线程参与进来
解决方式一:同步代码块(synchronized)
代码实现
①这个是实现Runnable去卖票
②这个是继承Thread实现的卖票
解决方式二:同步方法(synchronized)
如果操作的共享数据的代码完整的声明在一个方法中,我们不妨将该方法声明为synchronized的
1.同步的方法仍然涉及到同步监视器,只不过不需要我们显示声明
2.非静态的同步方法,同步监视器是:this
静态的同步方法:同步监视器是:当前类的本省
代码实现
①这个是实现Runnable卖票
这里是将要线程执行的操作写进一个show()里,用synchronized去修饰该方法,然后在run()中去调用.
②这个是继承Thread实现的卖票
解决方式三:Lock锁
步骤:1.在实现类里去实例化一个lock
2.在操作共享数据前去调用lock()去锁定
3.结束后还要去调用unlock()解锁
代码实现
这三种方法的优先级
lock --> 同步代码块(已经进入方法体,分配了相应的资源) --> 同步方法