美文网首页
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的使用

    为什么要使用Synchronized关键字?为了解决线程高并发安全问题,共享数据,多线程共同操作共享数据,Sync...

  • synchronized关键字

    synchronized锁住的不是代码而是对象 synchronized的使用 synchronized代码块,被...

  • 面试题1

    1.写出synchronized的使用方式 synchronized的三种应用方式 synchronized关键字...

  • 2017-12-28

    synchronized和volatile volatile仅能使用在变量级别;synchronized则可以使用...

  • 05 java并发编程-synchronized 细节说明

    synchronized 细节说明 synchronized 同步语句块的实现使用的是 monitorenter ...

  • iOS_多线程锁相关_优秀非简书资源

    正确使用@synchronized()

  • synchronized与Lock使用哪个

    只有当synchronized无法满足需求时,才需要使用Lock,否则,一律使用synchronized。 使用L...

  • iOS中的常见锁

    @synchronized 日常开发中常常需要使用锁,可能大多数是使用OC封装的@synchronized,使用起...

  • Java多线程同步

    synchronized关键字 synchronized关键字修饰函数方法使用synchronized关键字时,会...

  • cas和synchronize

    CAS与Synchronized的使用情景1、对于资源竞争较少(线程冲突较轻)的情况,使用synchronized...

网友评论

      本文标题:2019-08-16 Synchronized的使用

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