【解决线程安全问题:同步代码块】

为什么会出现线程安全的问题?(拿来判断是否有线程安全问题的标准)

  1.是否是多线程环境

  2.是否有共享数据

  3.是否有多条语句操作共享数据

如何解决线程安全问题?

  让程序运行在线程安全的环境中

怎么实现?

  1.共享数据只造一个

  2.把多个语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可

JAVA提供了同步机制

  同步代码块:

    格式:

      synchronized(对象){

        需要同步的代码;

      }

  

卖票程序解决线程安全后的代码:

package test;

/**
 * @Description
 * @Author shusheng
 * @Email [email protected]
 * @Date 2018/8/31
 */
public class SellTicketTwo implements Runnable{
   /**注意,如果是用继承的方式,此处必须用静态修饰*/                               
    private int tickets = 60;
    /**创建锁对象*/
    private Object obj = new Object();

    @Override
    public void run(){
        while(true){
            synchronized(obj){
                if(tickets>0){
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
                    tickets--;
                }
            }
        }
    }

}

测试

package test;

/**
 * @Description
 * @Author shusheng
 * @Email [email protected]
 * @Date 2018/8/31
 */
public class SellTicketTest {

    public static void main(String[] args) {
        /**创建一份资源对象*/
        SellTicketTwo two = new SellTicketTwo();
        /**创建三个线程*/
        Thread t1 = new Thread(two,"窗口一");
        Thread t2 = new Thread(two,"窗口二");
        Thread t3 = new Thread(two,"窗口三");
        t1.start();
        t2.start();
        t3.start();

    }
}

执行结果:

窗口一正在出售第60张票
窗口一正在出售第59张票
窗口一正在出售第58张票
窗口一正在出售第57张票
窗口一正在出售第56张票
窗口一正在出售第55张票
窗口一正在出售第54张票
窗口一正在出售第53张票
窗口一正在出售第52张票
窗口一正在出售第51张票
窗口一正在出售第50张票
窗口一正在出售第49张票
窗口一正在出售第48张票
窗口一正在出售第47张票
窗口三正在出售第46张票
窗口三正在出售第45张票
窗口三正在出售第44张票
窗口二正在出售第43张票
窗口二正在出售第42张票
窗口三正在出售第41张票
窗口三正在出售第40张票
窗口三正在出售第39张票
窗口三正在出售第38张票
窗口三正在出售第37张票
窗口一正在出售第36张票
窗口一正在出售第35张票
窗口一正在出售第34张票
窗口三正在出售第33张票
窗口三正在出售第32张票
窗口三正在出售第31张票
窗口三正在出售第30张票
窗口二正在出售第29张票
窗口二正在出售第28张票
窗口二正在出售第27张票
窗口三正在出售第26张票
窗口一正在出售第25张票
窗口一正在出售第24张票
窗口一正在出售第23张票
窗口一正在出售第22张票
窗口一正在出售第21张票
窗口一正在出售第20张票
窗口一正在出售第19张票
窗口一正在出售第18张票
窗口一正在出售第17张票
窗口一正在出售第16张票
窗口一正在出售第15张票
窗口一正在出售第14张票
窗口一正在出售第13张票
窗口一正在出售第12张票
窗口三正在出售第11张票
窗口三正在出售第10张票
窗口三正在出售第9张票
窗口三正在出售第8张票
窗口三正在出售第7张票
窗口三正在出售第6张票
窗口三正在出售第5张票
窗口三正在出售第4张票
窗口二正在出售第3张票
窗口二正在出售第2张票
窗口二正在出售第1张票

猜你喜欢

转载自www.cnblogs.com/zuixinxian/p/9566453.html