美文网首页
synchronized的使用

synchronized的使用

作者: jeffrey要努力 | 来源:发表于2018-11-15 16:56 被阅读6次

    使用synchronized 修饰方法

    public class TestSync extends Thread{
        private int position;
        public TestSync(int position){
            this.position = position;
        }
        @Override
        public void run() {
            super.run();
            try {
                doSomething(position);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public synchronized void doSomething(int position) throws InterruptedException {
            Log.d("TestSync","doSomething start " + position);
            Thread.sleep(2000);
            Log.d("TestSync","doSomething end " + position);
        }
    }
    

    测试:生成三个TestSync对象,让他运行

    for (int i = 0 ; i < 3 ;i ++){
                        TestSync testSync = new TestSync(i);
                        testSync.start();
    }
    

    结果: synchronized 不能锁同一个类的不同对象

     doSomething start 1
     doSomething start 2
     doSomething start 0
    doSomething end 1
    doSomething end 2
    doSomething end 0
    

    换成一个对象运行在不同的线程中运行呢

     TestSync testSync = new TestSync(0);
    for (int i = 0 ; i < 3 ;i ++){
            new Thread(testSync).start();
     }
    

    结果:一个完成后才能继续下一个,synchronized 成功锁住了对象

    01-01 13:46:16.985 D/TestSync: doSomething start 0
    01-01 13:46:18.986 D/TestSync: doSomething end 0
    01-01 13:46:18.986  D/TestSync: doSomething start 0
    01-01 13:46:20.986  D/TestSync: doSomething end 0
    01-01 13:46:20.986  D/TestSync: doSomething start 0
    01-01 13:46:22.986  D/TestSync: doSomething end 0
    

    结论

    synchronized关键字修饰一个方法,作用的对象是这个类,一个类并发调用这个方法可以顺序执行,但是多个相同的类调用这个方法,顺序就是不可控的,正常使用中一般都是对单例对象的一些方法使用synchronized关键字

    使用synchronized 修饰对象或者.class

    下面的代码效果是一样的,作用于类的.同一个类的多个对象,并发执行doSomething方法,可以保证执行顺序

    public void doSomething2(int position) throws InterruptedException {
            synchronized(TestSync.class){
                Log.d("TestSync","doSomething start " + position);
                Thread.sleep(2000);
                Log.d("TestSync","doSomething end " + position);
            }
        }
    

    或者

     private static final Object object = new Object();
     public void doSomething3(int position) throws InterruptedException {
            synchronized(object){
                Log.d("TestSync","doSomething start " + position);
                Thread.sleep(2000);
                Log.d("TestSync","doSomething end " + position);
            }
        }
    

    结果

     doSomething start 1
     doSomething start 2
     doSomething start 0
    doSomething end 1
    doSomething end 2
    doSomething end 0
    

    相关文章

      网友评论

          本文标题:synchronized的使用

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