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修饰的方法时是可以访问的

你可能感兴趣的:(2019-08-16 Synchronized的使用)