Android 中 synchronized的基本使用

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


使用synchronized用来修饰方法

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

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

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

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

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


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

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

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


线程启动
调用方法



打印结果

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

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


更改后的方法



打印结果




使用synchronized用来修饰代码块

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

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

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

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



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


更改后方法



打印结果

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

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

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



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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容