JUC练习——线程安全的计数器

 前言

当我们在多线程环境下需要共享一个计数器时,确保计数操作的线程安全性是至关重要的。线程安全的计数器能够确保在多个线程同时访问和修改计数器时,不会出现数据不一致或者竞态条件的问题。常见的实现方式包括使用锁机制(如 synchronized 或 ReentrantLock )、使用原子变量(如 AtomicInteger )。

着两种方式实现的原理都很简单,代码也比较简单。

AtomicInteger实现

AtomicInteger实现原理主要就是通过其原子类的特性,它本身就提供了原子操作。

实现及其使用如下:

public class AtomicCounter implements Runnable{

    private static AtomicInteger count = new AtomicInteger(0);

    public synchronized static void calc() {
        if ((count.get()) < 1000) {
            int cur = count.incrementAndGet();// 自增1,返回更新值
            System.out.println("线程" + Thread.currentThread().getName() + " 正在运行,当前计数:" + cur);
        }
    }
    public void run() {
        while(true)
        {
            AtomicCounter.calc();
            try {
                Thread.sleep(0);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            AtomicCounter thread = new AtomicCounter();
            Thread t = new Thread(thread);
            t.start();
        }
    }
}

synchronized实现

synchronized的实现原理主要就是通过锁住变量递增的方法。

代码及其使用如下:

public class SynCounter {
    private int count = 0;
    public synchronized void increment() {
        count++;
        System.out.println("线程" + Thread.currentThread().getName() + " 正在运行,当前计数:" + count);
    }
    public static void main(String[] args) {
        SynCounter counter = new SynCounter();
        for (int i = 0; i < 5; i++) {
            Thread incrementThread = new Thread(() -> {
                for (int j = 0; j < 100; j++) {
                    counter.increment();
                    try {
                        Thread.sleep(0);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            incrementThread.start();
        }
    }
}

相关推荐

  1. JUC练习——线安全计数器

    2024-07-15 22:24:03       20 阅读
  2. Rust 实现线安全 Lock Free 计数器

    2024-07-15 22:24:03       30 阅读
  3. JUC基础_1.JUC概述&&创建线方式

    2024-07-15 22:24:03       27 阅读
  4. JUC/多线用法(二)

    2024-07-15 22:24:03       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 22:24:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 22:24:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 22:24:03       58 阅读
  4. Python语言-面向对象

    2024-07-15 22:24:03       69 阅读

热门阅读

  1. vue3~

    vue3~

    2024-07-15 22:24:03      18 阅读
  2. QSqlQuery::value: not positioned on a valid record

    2024-07-15 22:24:03       22 阅读
  3. 基于金碟云星空实现硬件ECN校验

    2024-07-15 22:24:03       18 阅读
  4. ObjectiveC 内存管理

    2024-07-15 22:24:03       21 阅读
  5. 7.15作业

    2024-07-15 22:24:03       23 阅读
  6. 【C++】继承与多态相关11道面试题整理

    2024-07-15 22:24:03       20 阅读
  7. .NET Core项目中添加MIME类型

    2024-07-15 22:24:03       21 阅读
  8. 对于RBAC模型的认识

    2024-07-15 22:24:03       20 阅读
  9. 开源项目面临的机遇与挑战

    2024-07-15 22:24:03       20 阅读
  10. 【C++语言】正则表达式

    2024-07-15 22:24:03       20 阅读
  11. Mybatis防止SQL注入

    2024-07-15 22:24:03       21 阅读