美文网首页
2019-08-16 Synchronized的使用

2019-08-16 Synchronized的使用

作者: xiaohuage | 来源:发表于2019-08-16 17:21 被阅读0次

    为什么要使用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的使用

          本文链接:https://www.haomeiwen.com/subject/gtzfsctx.html