2019-08-16 Synchronized的使用

为什么要使用Synchronized关键字?为了解决线程高并发安全问题,共享数据,多线程共同操作共享数据,Synchronized可以保证同一时刻只有一个线程访问代码块或者方法。

结论:当两个线程同时对一个对象的一个方法进行操作,只有一个线程能够抢到锁。因为一个对象只有一把锁,一个线程获取了该对象的锁之后,其他线程无法获取该对象的锁,就不能访问该对象的其他synchronized实例方法,但是可以访问非synchronized修饰的方法

例题:

1、一个线程获取了该对象的锁之后,其他线程来访问其他synchronized实例方法现象:

public synchronized void method1() {

        System.out.println("Method 1 start");

        try {

            System.out.println("Method 1 execute");

            Thread.sleep(3000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("Method 1 end");

    }

    public synchronized void method2() {

        System.out.println("Method 2 start");

        try {

            System.out.println("Method 2 execute");

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("Method 2 end");

    }

        public static void main(String[] args) {

            final syncTest test = new syncTest();

            new Thread(new Runnable() {

                @Override

                public void run() {

                    test.method1();

                }

            }).start();

            new Thread(new Runnable() {

                @Override

                public void run() {

                    test.method2();

                }

            }).start();

        }

输出结果:


2、一个线程获取了该对象的锁之后,其他线程来访问其他非synchronized实例方法现象:

去掉②中方法二的synchronized:

public synchronized void method1() {

        System.out.println("Method 1 start");

        try {

            System.out.println("Method 1 execute");

            Thread.sleep(3000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("Method 1 end");

    }

    public void method2() {

        System.out.println("Method 2 start");

        try {

            System.out.println("Method 2 execute");

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("Method 2 end");

    }

        public static void main(String[] args) {

            final syncTest test = new syncTest();

            new Thread(new Runnable() {

                @Override

                public void run() {

                    test.method1();

                }

            }).start();

            new Thread(new Runnable() {

                @Override

                public void run() {

                    test.method2();

                }

            }).start();

        }

输出结果:


分析:当线程1还在执行时,线程2也执行了,所以当其他线程来访问非synchronized修饰的方法时是可以访问的

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容