首页 > 其他分享 >Android开发 - synchronized 关键字控制多个线程对共享资源的访问解析

Android开发 - synchronized 关键字控制多个线程对共享资源的访问解析

时间:2024-08-27 16:28:51浏览次数:12  
标签:count synchronized 共享资源 线程 increment 修饰 public

什么是 synchronized

  • synchronized 一个关键字,用于实现线程同步。其主要作用控制多个线程共享资源访问,确保被 synchronized 修饰的代码块或方法同一时间只有一个线程可以执行,从而避免数据不一致的问题

为什么需要 synchronized

  • 多线程编程中,多个线程可能同时访问修改共享数据。如果不加以控制,可能会导致数据不一致程序错误例如:一个线程正在写入一个变量,另一个线程正在读取该变量,在这种情况下,可能会读取到不完整错误的数据。为了解决这个问题,使用 synchronized确保某个代码块或方法在同一时间只被一个线程执行

synchronized 的用法

修饰实例方法

  • synchronized 用来修饰一个实例方法时,它会对当前对象实例 (this) 加锁。也就是说,同一个对象所有 synchronized 实例方法同一时间只能一个线程访问

    public class Counter {
        private int count = 0;
    
        // synchronized 修饰符用于同步方法
        // increment() 方法被 synchronized 修饰,这意味着如果有多个线程尝试同时调用 increment() 方法,只有一个线程可以进入,其他线程必须等待,直到当前线程执行完毕
        public synchronized void increment() {
            count++;
        }
    
        public int getCount() {
            return count;
        }
    }
    

修饰静态方法

  • synchronized 用来修饰一个静态方法时,它会对当前类Class 对象加锁。这意味着同一个类所有 synchronized 静态方法同一时间只能一个线程访问

    public class Counter {
        private static int count = 0;
    
        // synchronized 修饰符用于同步静态方法
        // increment() 方法是静态方法,被 synchronized 修饰后,所有线程在同一时间只能有一个线程可以执行这个方法
        public static synchronized void increment() {
            count++;
        }
    
        public static int getCount() {
            return count;
        }
    }
    

修饰代码块

  • synchronized 还可以用来修饰代码块,这样可以锁定一个特定的对象,而不是整个方法。这种用法可以提供更细粒度控制,可以提高性能

    public class Counter {
        private int count = 0;
        private final Object lock = new Object();
    
        public void increment() {
            // increment() 方法中的代码块被 synchronized 锁定,锁定对象是 lock。只有一个线程可以进入 synchronized (lock) 内部的代码块,其他线程需要等待
            synchronized (lock) {
                count++;
            }
        }
    
        public int getCount() {
            return count;
        }
    }
    

总结

  • synchronized 是一种同步机制,用于防止多个线程同时访问共享资源

  • 可以使用 synchronized 修饰方法或代码块,以确保线程安全

  • 使用 synchronized 可以防止数据不一致问题,但也可能引起线程阻塞,从而影响性能。因此,在使用时尽量锁定尽可能少的代码块确保程序效率

标签:count,synchronized,共享资源,线程,increment,修饰,public
From: https://www.cnblogs.com/ajunjava/p/18382951

相关文章

  • 使用 Callable 和 FutureTask 创建线程
    转自:http://t.csdnimg.cn/jl1ZN原文链接:https://blog.csdn.net/wzhy2016/article/details/131178612 操作流程:   创建Callable实现类的实例,并实现call方法。   使用FutureTask类来包装Callable对象(第一步创建实现类的实例)。   使用FutureTask对象作为Thread对象的......
  • 线程中的虚假唤醒
    理论基础:线程间通信:1、生产者+消费者2、通知等待唤醒机制wait和notify为什么一个关于线程的操作,方法却放在Object包下?因为多线程的线程安全,必定依赖于锁,而任何对象都可以当锁对象,所以将公共的方法放入到Object类中。多线程编程模板B:判断干活通知基于以上理论,我们......
  • 多线程-interrupt
    多线程-interrupt中断一个线程非常简单,只需要在其他线程中对目标线程调用interrupt()方法,目标线程需要反复检测自身状态是否是interrupted状态,如果是,就立刻结束运行。1、案例一packagecom.example.one;/***@authortom*/publicclassMain{publicstatic......
  • python aiohttp创建很多线程的问题及解决例子解析
    在使用aiohttp进行异步HTTP请求时,创建大量线程可能会导致性能问题。根据搜索结果,这个问题通常与DNS查询有关,因为默认情况下,每次发送请求时aiohttp.ClientSession都会进行DNS查询,这是一个阻塞操作,会为每次查询创建一个新线程。为了解决这个问题,可以通过指定一个AsyncR......
  • C#上位机开发——多线程启动停止暂停继续
    引用:上位机开发——多线程启动停止暂停继续-哔哩哔哩(bilibili.com)前言初学者学习编程时,很容易因为多线程出现各种问题,导致不敢使用多线程。但是多线程技术在做开发中,是不可忽视的一个技术,基本上我们实际应用中,每个项目都会使用多线程,所以多线程技术必须掌握。为什么要用多......
  • Java线程的实践及原理揭秘
    Java线程的实践及原理揭秘并发是什么?系统支持高并发的因素是哪些?1.如何理解系统的并发一般来说,系统在单位时间内能够承载的并发数就是整个系统同事能够处理的请求数量。对于并发的指标通常通过TPS/QPS来表示QPS:每秒处理的查询数(Queries-Per-Second)TPS:每秒处理的事务数(Tr......
  • java 线程
    1.Java中有哪几种方式来创建线程执行任务1.继承Thread类(单继承)2.Runnable接口(没有继承限制)但是无法返回值3.callable接口结合FutureTask4.利用线程池来创建线程使用ExecutorService调用execute通过runnable创建底层都是基于runnable2.为什么不建议使用Executors来创建......
  • 操作系统终止线程
    终止线程方法1:从线程入口函数中return,主线程除外。方法2:调用pthread_exit函数。voidpthread_exit(void*retval);retval-和线程过程函数的返回值语义相同。注意:在任何线程中调用exit函数都将终止整个进程。问题:主线程结束,子线程是否会跟着一起结束?主线程结束,并不会......
  • 一次性下发100w的优惠券/短信/二维码,兼顾线程池参数可配置 在Spring 中 ThreadPoolTas
    一次性下发100w的优惠券/短信/二维码,兼顾线程池参数可配置在Spring中ThreadPoolTaskExecutor的使用1、场景需求分析针对6.18,11.11这种场景,平台一次性发布500w张优惠券,或者对于锁单用户统一发下100w张确认信息,同时我们平时有抢购茅台的场景,京东一次性发布10w个验证码,主要是针......
  • Python 多线程编程技巧举例
    Python多线程(Multithreading)是一种编程技术,允许在同一程序中同时执行多个独立的逻辑流,即线程。每个线程都有自己的程序计数器、栈空间和局部变量,它们共享同一进程的全局变量、文件描述符和其他系统资源。线程是操作系统调度的基本单位,能够在单个进程中并发运行,从而实现任务......