【Java】多线程的并发安全

简介: 在使用多线程处理问题时,不可避免的会遇到很多安全问题,解决线程间共享的安全问题,可以分为有锁和无锁两类

多线程的并发安全

问题:统计某接口访问次数

//错误示例
public class AccessCounter {
    /**
     * 访问接口的次数
     */
    int count;
    public void access(){
        count++;
    }
}

接口很可能被多个线程同时访问,即access()方法被多个线程调用

解决方案

1.无锁

  • 用局部变量可以避免出现线程安全问题
  • 定义不可变对象,如String类型
  • ThreadLocal:

    每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题
  • CAS原子类:
* 在Java中的实现则通常是指以英文Atomic为前缀的一系列类,它们都采用了CAS的思想。
* Atomic系列的使用的是一种无锁化的CAS操作,是基于乐观锁的,它的并发性能比较高,可以多个线程同时执行,并且保证不会出现线程安全问题。
public class AccessCounter {
    /**
     * 访问接口的次数
     */
    AtomicInteger count = new AtomicInteger(0);
    public void access(){
        count.incrementAndGet();
        System.out.println("访问次数:"+count.get());
    }
} 

2.加锁

  • Synchronized加锁/ReentrantLock加锁
public class Counter {
    int i = 0;
    ReentrantLock lock = new ReentrantLock();

    /**
     *     ReentrantLock加锁
     */
    public void lock1(){
        lock.lock();
        try {
            add();
        }finally {
            lock.unlock();
        }
    }
    /**
     *     synchronized加锁
     */
    
    public synchronized void lock2(){
        add();    
    }
    
    void add(){
        i++;
    }
}
相关文章
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
117 0
|
2月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
277 83
|
2月前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
222 83
|
2月前
|
SQL 缓存 安全
深度理解 Java 内存模型:从并发基石到实践应用
本文深入解析 Java 内存模型(JMM),涵盖其在并发编程中的核心作用与实践应用。内容包括 JMM 解决的可见性、原子性和有序性问题,线程与内存的交互机制,volatile、synchronized 和 happens-before 等关键机制的使用,以及在单例模式、线程通信等场景中的实战案例。同时,还介绍了常见并发 Bug 的排查与解决方案,帮助开发者写出高效、线程安全的 Java 程序。
136 0
|
3月前
|
存储 Java
说一说 JAVA 内存模型与线程
我是小假 期待与你的下一次相遇 ~
|
3月前
|
移动开发 Java
说一说 Java 是如何实现线程间通信
我是小假 期待与你的下一次相遇 ~
|
2月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
3月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
218 5
|
7月前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
204 20