美文网首页Android 技术开发
Android 中 synchronized的基本使用

Android 中 synchronized的基本使用

作者: 沈凤德 | 来源:发表于2017-01-13 14:15 被阅读1918次

    应用情况:多线程同时访问,并且代码块不能被同时执行的时候使用


    使用synchronized用来修饰方法

    基本执行过程:当多个线程同时访问被synchronized修饰的方法的时候,有且只有一个线程可以访问,当一个线程在访问的时候,其他线程只能等待。当一个线程访问完毕后下一个线程才可以访问。

    原理解析:当方法被synchronized修饰后,如果想要执行该方法就必须获得相应的锁。

     锁的说明:每个类又且仅有一个锁(针对静态方法),每个类的示例也是有且仅有一个锁。

    当多个线程在同时访问同一个方法的时候,执行该方法就必须获得相应的锁,同时锁只有一个,所以只能有一个线程可以获得锁,所以只有一个线程可以执行,当方法执行完毕,线程会释放锁,其他线程获取该锁,执行方法。

    进阶说明:由于每个类只有一个锁,所以当一个类中又多个方法被synchronized修饰的时候,在同一时间内只有一个方法可以获得锁,所以只有一个方法可以执行。


    原理说明进行测试验证:(生物实验有个唯一变量原则,本次也采用这个原则)

    验证多线程同时访问被synchronized修饰的方法,方法顺序执行结果:

    1.当多线程调用方法的时候,方法没有被synchronized修饰的时候的执行结果

    线程启动 调用方法 打印结果

    根据打印结果可以看出两个线程调用的方法的时候,方法会被同时执行。

    当我们仅仅为shwoDO()添加一个修饰关键字synchronized的时候方法就会被顺序调用。结果如下:

    更改后的方法 打印结果

    使用synchronized用来修饰代码块

         基本说明:当synchronized在修饰代码块的时候需要一个自定义锁,当在多线程访问,代码块的时候,只要获得自定义锁就可以执行。

          自定义锁:可以是一个类,也可以是一个实例(可以是Objcet的子类,也可以是当前类自己(this)),当具有相同自定锁的时候,代码块会顺去执行,当锁不同的时候互相不影响。

        每个类又且仅有一个锁(针对静态方法),每个类的示例也是有且仅有一个锁。

         基本书写格式:synchronized(自定义锁){同步执行代码块}



    测试将showDO()方法个能改为如图,代码块内部内容同样会同步执行。

    更改后方法 打印结果

    总结说明:synchronized具有有两种使用方法,第一种是修饰方法,第二种修饰代码块。

                     无论那中方法,被修饰的内容都会同步执行。这也是synchronized的作用。

                     关于两种方法的使用:对于修饰方法常常会发生不必要的代码块被同步,同时锁不可以选择,但是使用                   简单。对于修饰代码块方法用起来更精确,需要自己制定锁,用起来稍微麻烦一点。


    若有错误之初,请给予指示,谢谢~~~~~

    相关文章

      网友评论

        本文标题:Android 中 synchronized的基本使用

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