多线程数据安全问题

多线程的好处:cpu利用效率高,可以缩短程序执行时间,提高程序执行效率和性能。

如何实现多线程下的数据共享(安全)问题?

主要用到synchronized对象同步锁机制。

一般来说,我们都是通过Runnable去实现多线程。如果我们不使用同步锁,那么在对共享数据进行操作时就会出现:当第1个线程想操作A状态的数据时,发现已经被第二个线程修改为了B状态,于是无法完成本想完成的任务。比如售票,假如我们票数固定,当我们同时开启三个线程进行售票。就可能会出现我线程1还未执行完,但是我线程2抢到了cpu资源,在线程1执行了一部分的时候执行了线程2,最终导致线程1和线程2卖出的是同一张票。这个就是我们常遇到的线程数据安全问题,通常通过synchronized(对象同步锁来解决)。

那么synchronized如何实现呢?

public class MyRunnable implements Runnable {
    // 在成员变量位置将票定义为数字100
    /**
     * @Fields number :票数
     */
    private int number = 100;

    public void run() {
        /**
         * @Title: run
         * @Description: 完成卖票的线程逻辑
         * @see java.lang.Runnable#run()
         */
        // 车站不停地在卖票

        while (true) {
            synchronized (this) {
                // 有票就买票
                if (number > 0) {
                    System.out.println(Thread.currentThread().getName() + "正在销售第" + (number--) + "张票");
                } else {
                    // 没有票,就跳出循环,不再卖票
                    System.out.println("卖完了");
                    break;
                }
            }
        }
    }

}

扫描二维码关注公众号,回复: 5808671 查看本文章

public class MyRunnableDemo {

    /**
     * @Title: main
     * @Description: TODO(这里用一句话描述这个方法的作用)
     * @param args
     */
    public static void main(String[] args) {
        MyRunnable MyRunnable1 = new MyRunnable();
        
        Thread thread1 = new Thread(MyRunnable1);
        Thread thread2 = new Thread(MyRunnable1);
        Thread thread3 = new Thread(MyRunnable1);
        
        thread1.start();
        thread2.start();
        thread3.start();
    }

}

如果一个线程已经进入该对象锁执行,那么下一个线程会等待当前线程执行完毕后在进入同步代码块。保证一次只有一个线程运行同步代码块,来保证数据准确性。

猜你喜欢

转载自blog.csdn.net/qq_36276066/article/details/89083606