android 锁的使用教程,Android 中 synchronized的基本使用

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

使用synchronized用来修饰方法

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

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

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

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

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

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

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

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

35af333fdde4

线程启动

35af333fdde4

调用方法

35af333fdde4

打印结果

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

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

35af333fdde4

更改后的方法

35af333fdde4

打印结果

使用synchronized用来修饰代码块

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

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

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

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

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

35af333fdde4

更改后方法

35af333fdde4

打印结果

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

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Androidsynchronized是一种同步机制,用于保证多个线程对同一共享资源的访问顺序和正确性。当一个线程进入synchronized代码块时,它会尝试获取,如果已经被其他线程持有,则该线程会被阻塞,直到被释放。只有获取到的线程才能执行synchronized代码块的代码,其他线程则需要等待。这样可以避免多个线程同时访问共享资源造成的数据不一致或者竞争条件等问题。 ### 回答2: 在Android开发synchronized是一个关键字,用于实现对代码块或方法的同步操作。在多线程环境下,synchronized关键字确保代码的原子性和线程的安全性。 当一个方法或代码块被synchronized修饰时,它将成为互斥区域。这意味着当一个线程进入synchronized代码块时,其他线程将被阻塞,直到当前线程执行完毕并释放。这样,就能够保证同一时间只有一个线程能够访问被synchronized修饰的代码块,避免了多个线程同时访问共享资源导致的数据不一致等问题。 在Android开发,常见的使用synchronized的场景有以下几种: 1. 对共享资源的读写操作:例如多个线程同时读写一个共享的数据结构,为了保证数据的一致性,需要使用synchronized关键字来同步读写操作。 2. 对共享资源的访问控制:有些时候,我们希望只有一个线程可以访问某一段代码,这时就可以使用synchronized关键字来进行线程的互斥。 3. 对并发数据结构的操作:Android提供了一些并发数据结构,如ConcurrentHashMap和CopyOnWriteArrayList,这些数据结构已经内置了线程安全的机制,但如果对其进行多个操作的组合,仍然需要使用synchronized来保证线程的同步。 需要注意的是,synchronized关键字会带来一定的性能开销,因为它在执行时需要获取,并在释放时进行一些额外的操作。因此,在使用synchronized时,应尽量减小同步代码块的粒度,避免对不必要的代码进行同步。另外,在Android开发,还可以使用其他的同步机制,如Lock和Condition,根据具体的需求来选择合适的同步方式。 ### 回答3: 在Android开发synchronized关键字用于实现线程的同步和互斥。 当一个方法或者代码块被synchronized修饰时,同一时刻只有一个线程可以执行该方法或者代码块,其他线程需要等待。 synchronized作用于方法时,锁定的是当前对象实例。 synchronized作用于静态方法时,锁定的是当前类的Class对象。 synchronized作用于代码块时,需要指定一个锁定对象,当多个线程需要访问这个代码块时,只有获得锁定对象的线程才能执行,其他线程需要等待。 在使用synchronized的过程,需要注意以下几点: 1. 为了达到线程同步的目的,synchronized需要确保多个线程访问的是同一个共享对象。如果多个线程访问的是不同的对象实例,那么synchronized就无法实现同步。 2. 避免过多使用synchronized,因为它会导致线程的阻塞,影响程序的性能。 3. 尽量使用粒度较小的,减小的竞争范围,提高程序的并发性能。 总之,synchronized是一种常用的线程同步机制,在多线程环境下可以确保共享资源的安全访问。但是需要合理使用,避免出现死和性能问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值