首页 > 其他分享 >安卓之同步机制优劣分析

安卓之同步机制优劣分析

时间:2023-12-17 13:22:23浏览次数:30  
标签:count 同步 int 优劣 安卓 private 线程 public

文章摘要

   随着移动设备的普及,安卓操作系统已成为全球使用最广泛的移动操作系统之一。在安卓开发中,多线程编程是不可避免的,而同步机制则是确保多线程正确、高效运行的关键。本文将深入分析安卓中几种常见的同步机制,包括它们的优缺点,并提供相应的代码示例。

正文

synchronized 关键字

   synchronized 是 Java 中的一种内置同步机制,它可以确保在同一时刻只有一个线程访问特定的代码块或方法。

优点

   简单易用:只需要在方法或代码块前加上 synchronized 关键字。

   可防止死锁:Java 虚拟机(JVM)在处理 synchronized 块时会自动处理锁的获取和释放顺序,从而降低死锁的风险。

缺点

   性能较低,因为每次访问都需要获取和释放锁。

   不支持更高级的同步需求,如可中断的锁、公平锁等。

   控制粒度较粗:整个方法或代码块都被锁定,可能导致不必要的阻塞。

   不支持超时等待:无法设置获取锁的超时时间。

   非公平锁:默认情况下,synchronized 锁是非公平的,可能导致某些线程长时间等待。

代码示例

public class SynchronizedExample {

private int count = 0;

public synchronized void increment() {

count++;

}

public synchronized int getCount() {

return count;

}

}

 

ReentrantLock

   ReentrantLock 是 java.util.concurrent.locks 包中的一个可重入锁,它提供了比 synchronized 更精细的锁定控制。

优点

   支持可中断的锁、公平锁和非公平锁等高级同步需求。

   性能较高,因为 ReentrantLock 使用了更高效的锁实现。

   支持中断:可以通过调用 lockInterruptibly() 方法并在其他线程中中断等待的线程。

缺点

   需要手动管理锁的获取和释放,增加了代码复杂度。

   如果忘记释放锁,可能会导致死锁。

代码示例

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {

private int count = 0;

private ReentrantLock lock = new ReentrantLock();

public void increment() {

lock.lock();

try {

count++;

} finally {

lock.unlock();

}

}

public int getCount() {

lock.lock();

try {

return count;

} finally {

lock.unlock();

}

}

}

 

Semaphore

   Semaphore 是一种计数信号量,用于控制同时访问特定资源的线程数量。信号量是一种计数器,用于控制多个线程对共享资源的访问。在安卓中,信号量主要用于实现进程间通信和同步。通过使用信号量,可以确保在多线程环境下,同一时刻只有一个线程能够访问共享资源,从而避免数据竞争和死锁等问题。

优点

   支持多个线程之间的同步。

   可以控制同时访问共享资源的线程数量。

   支持超时等待和中断。

缺点

   如果不使用 tryLock() 方法,可能会导致死锁。

   不直接保护共享资源:需要额外的代码来确保资源的安全访问。

   如果忘记释放信号量,可能会导致资源泄露。

代码示例

import java.util.concurrent.Semaphore;

public class SemaphoreExample {

private int count = 0;

private Semaphore semaphore = new Semaphore(1);

public void increment() {

semaphore.acquire();

try {

count++;

} finally {

semaphore.release();

}

}

public int getCount() {

semaphore.acquire();

try {

return count;

} finally {

semaphore.release();

}

}

}

 

CountDownLatch

优点

   支持多个线程之间的同步。

   可以等待多个线程完成操作。

缺点

   仅适用于特定场景。

代码示例

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {

private CountDownLatch latch = new CountDownLatch(1);

private int count = 0;

public void increment() {

count++;

latch.countDown();

}

public int getCount() {

return count;

}

}

 

Atomic 类

   Java 提供了一系列原子操作类,如 AtomicInteger、AtomicLong 等,这些类提供的方法都是线程安全的。

优点

   简单且高效:原子操作通常比使用锁更快。

   避免了锁的竞争:由于原子操作不会阻塞,因此可以减少线程间的竞争。

缺点

   功能有限:仅适用于简单的原子操作,如计数、更新等。

   不能保护复杂的操作:对于涉及多个变量或更复杂的操作,原子类可能不够用。

代码示例

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {

private final AtomicInteger counter = new AtomicInteger(0);

public void increment() {

counter.incrementAndGet();

}

public void decrement() {

counter.decrementAndGet();

}

}

 

CyclicBarrier

优点

   支持多个线程之间的同步。

   可以等待多个线程完成操作。

缺点

   仅适用于特定场景。

代码示例

import java.util.concurrent.CyclicBarrierExample;

public class CyclicBarrierExample {

private CyclicBarrier barrier = new CyclicBarrierExample(1);

private int count = 0;

public void increment() {

count++;

}

public int getCount() {

return count;

}

 

条件变量 (Condition Variable)

   条件变量是一种同步机制,用于在一定条件下唤醒等待的线程。在安卓中,条件变量通常用于实现生产者-消费者模型,确保生产者和消费者之间的数据同步。

优点

   允许线程在满足特定条件时被唤醒,适合生产者-消费者模型。

缺点

   如果使用不当,可能导致虚假唤醒或死锁。

代码示例

Condition condition = lockObject.newCondition(); // 创建一个条件变量

 

// 生产者线程生产数据并唤醒消费者线程

condition.await(); // 等待条件满足,如果条件不满足则进入等待状态

// 生产数据并唤醒消费者线程

condition.signal(); // 唤醒等待的消费者线程

 

// 消费者线程等待数据并被生产者线程唤醒

condition.await(); // 等待条件满足,如果条件不满足则进入等待状态

// 处理数据并继续执行后续操作

  

读写锁 (Read-Write Lock)

优点

   允许多读单写,提高了并发性能。

缺点

   写操作可能受到读操作的阻塞。

代码示例

ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

 

// 读线程

readWriteLock.readLock().lock(); // 获取读锁

try {

// 读取数据  

} finally {

readWriteLock.readLock().unlock(); // 释放读锁  

}

 

// 写线程类似,使用readWriteLock.writeLock()获取和释放写锁`

 

总结

   每种同步机制都有其特定的适用场景和优缺点。选择合适的同步机制对于确保程序的正确性和性能至关重要。开发者应根据实际需求仔细权衡,选择最合适的同步机制。同时,正确的使用方式和时机也是避免并发问题的关键。

 

标签:count,同步,int,优劣,安卓,private,线程,public
From: https://www.cnblogs.com/hxznfuture/p/17908958.html

相关文章

  • 直播平台源码,教你如何写出同步与异步
    直播平台源码,教你如何写出同步与异步同步示例代码:console.log("开始");functionsyncOperation(){console.log("同步操作");}syncOperation();console.log("结束"); 输出结果:开始同步操作结束 在上述代码中,同步操作syncOperation()按照顺序......
  • 电脑时间不同步导致的上网报错:core/proxy/vmess/encoding: failed to read response h
    报错内容: 2023/12/1614:08:56[Warning][775541588]xxxxx.com/core/app/proxyman/outbound:failedtoprocessoutboundtraffic>xxxxx.com/core/proxy/vmess/outbound:connectionends>xxxxx.com/core/proxy/vmess/outbound:failedtoreadheader>xxxx......
  • 数据库同步工具,PanguSync后起之秀
    随着数字化时代的快速发展,数据已经成为企业运营的核心。为了确保数据的准确性和一致性,数据库同步工具成为了企业不可或缺的工具。而在众多数据库同步工具中,PanguSync以其卓越的性能和强大的功能,逐渐成为了行业中的后起之秀。 一、高效稳定的同步性能PanguSync以其高效稳定的......
  • MT6789(MTK6789)安卓核心板定制_性能参数
    MT6789/HelioG99核心板是一款强大的处理器,它是天玑700的简化版,但去掉了5G基带。该核心板采用台积电6nm制程工艺,具有八核CPU,其中包括2个A76核心主频2.2GHz和6个A55核心主频2.0GHz。此外,它还搭载了Mali-G57MC2GPU,提供出色的图形处理性能。MT6789核心板配备了高性能的LPD......
  • 世微 AP9166 DC-DC同步降压恒压芯片 18V 2A同步降压转换器
     600KHz,18V,2A同步降压转换器概述AP9166是一款完全集成的效率2A同步整流降压转换器。AP9166运行在宽输出电流上以高效率负载范围。此设备提供两个操作模式、PWM控制和PFM模式切换控制,允许更宽范围的高效率负载AP9166至少需要现成标准的数量外部组件,在中可用符合SOT23-6标准的6针......
  • Linux配置时间同步 - chrony
    一、chrony简介chrony是一款开源的NTP时间同步软件,主要用于Unix-like计算机系统(如Linux、BSD和macOS)来提供高精度的时间同步。Chrony的设计注重性能和可靠性,具有低延迟、低CPU占用率、低内存消耗等优点。chrony由两个程序组成,chronyd(服务器端)和chronyc(客户端)chronyd:后台运行的守护......
  • 安卓之各种Adapter优劣分析
    文章摘要  在 Android 开发中,适配器(Adapter)是一种非常重要的设计模式,它用于将数据与视图组件进行绑定。适配器可以帮助我们在不同的视图组件(如 ListView、GridView、RecyclerView 等)中展示数据,而无需为每个组件编写重复的代码。以下是 Android 中常用的几种适配器,以及它们......
  • 安卓之各种Adapter优劣分析
    文章摘要  在 Android 开发中,适配器(Adapter)是一种非常重要的设计模式,它用于将数据与视图组件进行绑定。适配器可以帮助我们在不同的视图组件(如 ListView、GridView、RecyclerView 等)中展示数据,而无需为每个组件编写重复的代码。以下是 Android 中常用的几种适配器,以及它......
  • (原创)安卓快速使用简单的BottomNavigation(结合fragment)
    原创声明:本文所有图片和代码皆由本人制作和编写。目录前言目标效果第0步导入库第1步准备好一些资源fragmentdrawable图标第一小步第二小步第二步创建menu第三步创建navigation注意第四步绑定前言这篇文章是边写大作业边查资料边写的,查了很多资料,翻了很多论坛,也遇到了很多......
  • Flutter开发之安卓打包,和获取签名相关信息,公钥值相关操作
    我们Flutter开发中,难免有些小朋友因需求要获取打包签名的一些相关信息,下面我们来讲一下怎么获取一生成签名文件我们打包安卓APK包需要先生成签名文件,需运行以下指令,生成签名文件keytool-genkey-v-keystoreGMT\_keystore.keystore-aliasGMT\_keystore-keyalgRSA-keysi......