线程安全问题的解决方式

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

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

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

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

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

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

代码实现

①这个是实现Runnable去卖票

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

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

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

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

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

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

代码实现

①这个是实现Runnable卖票

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

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

解决方式三:Lock锁

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

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

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

代码实现

这三种方法的优先级

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

经验分享 程序员 微信小程序 职场和发展