一招叫你看懂java - synchronized

2022-01-24  本文已影响0人  晖仔Milo

背景

现在可以多个线程对同一片存储空间进行访问,这时存储空间里面的数据叫做共享数据。线程并发给我们带来效率的同时,也带了一些数据安全性的问题,数据安全性是一个很严重的问题,多个线程同时访问同一片数据区,很有可能把里面的数据弄的混乱。 所以Java语言提供了专门机制以解决这种数据安全性问题,有效避免了同一个数据对象被多个线程同时访问,从而导致数据的错乱的问题。

synchronized关键字用法

synchronized关键字可以作为函数的修饰符(也就是常说的同步方法)
synchronized关键字可以作为函数内的语句(也就是常说的同步代码块)

public class AsyncTest {

    public void startTest(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                int count = 0;
                while (count++<10){
                    printX("A", count);
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                int count = 100;
                while (count++<110){
                    printX("B", count);
                }
            }
        }).start();
    }

    private synchronized void printX(String flag, int x){
        System.out.println(flag + " : x == " + x);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

使用 synchronized 关键字,每次得到的结果都是不同的,而且耗时也达到了20s


image.png
image.png

而去掉 synchronized 关键字的运行结果是固定的,如下,而且耗时也固定为10s


image.png

怎么样,你悟到了没有?

上一篇 下一篇

猜你喜欢

热点阅读