Java多线程 原子性操作类的使用

Java多线程 原子性操作类的使用

在并发编程中,多个线程同时进行操作时,可能会出现线程安全问题。例如两个线程同时对同一个变量进行增加操作,结果可能不是期望的那个。Java提供了原子性操作类来解决这个问题。

原子性操作类

Java原子类是Java编程语言中的一种特殊类,它具有原子性,线程安全性和可比性,并提供了一种简单的基于锁的技术,通过这种技术实现多线程并发访问时变量的安全。

AtomicInteger类的使用

AtomicInteger类提供了原子操作的int型变量,包括增加,减少,增加并赋值,减少并赋值,获取和设置等方法。

示例1

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }

    public static void main(String[] args) throws InterruptedException {
        AtomicIntegerExample example = new AtomicIntegerExample();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    example.increment();
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    example.increment();
                }
            }
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println(example.getCount());
    }
}

示例2

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.addAndGet(10);
    }

    public int getCount() {
        return count.get();
    }

    public static void main(String[] args) throws InterruptedException {
        AtomicIntegerExample example = new AtomicIntegerExample();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    example.increment();
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    example.increment();
                }
            }
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println(example.getCount());
    }
}

AtomicLong类、AtomicBoolean类和AtomicReference类的使用

除了AtomicInteger类外,Java还提供了AtomicLong类,AtomicBoolean类和AtomicReference类。这些类提供了相应的Java基础数据类型的原子操作。

示例3

import java.util.concurrent.atomic.AtomicLong;

public class AtomicLongExample {
    private AtomicLong count = new AtomicLong(0);

    public void increment() {
        count.incrementAndGet();
    }

    public long getCount() {
        return count.get();
    }

    public static void main(String[] args) throws InterruptedException {
        AtomicLongExample example = new AtomicLongExample();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    example.increment();
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    example.increment();
                }
            }
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println(example.getCount());
    }
}

示例4

import java.util.concurrent.atomic.AtomicBoolean;

public class AtomicBooleanExample {
    private AtomicBoolean flag = new AtomicBoolean(false);

    public void setFlag() {
        flag.compareAndSet(false, true);
    }

    public boolean getFlag() {
        return flag.get();
    }

    public static void main(String[] args) {
        AtomicBooleanExample example = new AtomicBooleanExample();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                example.setFlag();
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (!example.getFlag()) {
                    System.out.println("Flag not set yet.");
                }
                System.out.println("Flag is set.");
            }
        });

        thread1.start();
        thread2.start();
    }
}

示例5

import java.util.concurrent.atomic.AtomicReference;

public class AtomicReferenceExample {
    private AtomicReference<String> name = new AtomicReference<>("");

    public void setName(String name) {
        this.name.compareAndSet("", name);
    }

    public String getName() {
        return name.get();
    }

    public static void main(String[] args) {
        AtomicReferenceExample example = new AtomicReferenceExample();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                example.setName("John");
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (example.getName().equals("")) {
                    System.out.println("Name not set yet.");
                }
                System.out.println("Name is " + example.getName() + ".");
            }
        });

        thread1.start();
        thread2.start();
    }
}

总结

使用Java原子类可以有效地解决多线程并发访问时变量的安全问题。在使用时,应该根据需要选择不同的原子类。需要注意的是,原子操作虽然保证了操作的原子性,但并不一定保证线程安全,具体使用需要谨慎。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程 原子性操作类的使用 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • ServletWebServerApplicationContext创建Web容器Tomcat示例

    关于”ServletWebServerApplicationContext创建Web容器Tomcat示例”,以下是完整攻略: ServletWebServerApplicationContext创建Web容器Tomcat示例 什么是ServletWebServerApplicationContext ServletWebServerApplicationCo…

    Java 2023年5月19日
    00
  • 详解SpringMVC的两种实现方式

    详解SpringMVC的两种实现方式 Spring MVC是一个基于MVC架构的Web框架,它可以用于构建Web应用程序。Spring MVC框架提供了一组组件,包括控制器、视解析器、处理器映射器、数据绑定、数据验证、异常处理等,可以帮助我们快速开发Web应用程序。在Spring MVC中,我们可以使用两种方式来实现控制器:注解方式和XML配置方式。 注解方…

    Java 2023年5月18日
    00
  • spring中的FactoryBean代码示例

    FactoryBean是Spring中一个非常重要的接口,常用于实例化非Bean类型对象或实例化有状态的Bean对象。在使用FactoryBean时,需要实现该接口并实现其中的方法,让Spring容器在初始化Bean时通过FactoryBean实现对Bean的创建和定制化处理。 1. 定义FactoryBean 在Spring中定义FactoryBean需要…

    Java 2023年5月31日
    00
  • ajax jquery实现页面某一个div的刷新效果

    下面我就来详细讲解一下“ajax jquery实现页面某一个div的刷新效果”的完整攻略: 1. 理解 AJAX 在使用 AJAX 前,我们需要先理解什么是 AJAX。AJAX 全称是 Asynchronous JavaScript and XML,翻译过来是“异步 JavaScript 和 XML”。它是一种用于创建快速动态网页的技术,允许在不重新加载整个…

    Java 2023年6月15日
    00
  • 2020最新版SSM框架整合教程

    让我来详细讲解一下“2020最新版SSM框架整合教程”的完整攻略。 1. 准备工作 在整合SSM框架之前,需要安装JDK、Maven以及相应的开发工具,比如IntelliJ IDEA或Eclipse,还需要准备好Web Server,比如Tomcat或Jetty。 2. 创建Maven项目 创建一个Maven Web项目,添加以下依赖: <depend…

    Java 2023年5月20日
    00
  • Java解析xml文件遇到特殊符号异常的情况(处理方案)

    Java 解析 XML 文件遇到特殊符号异常的处理方案 在 Java 中,常常使用第三方库来解析和操作 XML 文件,但是当 XML 文件中含有特殊符号时,解析会报错。下面介绍两种 Java 解决此问题的方法。 方法一:使用 Apache Commons Text 库的 StringEscapeUtils.unescapeXml 方法 Apache Comm…

    Java 2023年5月27日
    00
  • Java迭代器与Collection接口超详细讲解

    Java迭代器与Collection接口超详细讲解 什么是Java迭代器? Java中的迭代器是一种访问集合元素的方式,它提供了一种遍历集合的统一方法,可以不用关心底层集合的实现。迭代器可以依次访问集合中的每个元素,并且支持在遍历过程中进行元素的删除操作。 Java中的迭代器是通过java.util.Iterator接口实现的。Iterator接口实际上是一…

    Java 2023年5月26日
    00
  • Java实现购物管理系统

    Java实现购物管理系统攻略 1. 确定项目需求和功能 在 Java 实现购物管理系统之前,首先需要确定项目的需求和功能,包括: 用户登录和注册 商品浏览和搜索 商品添加、修改和删除 购物车功能 订单生成和支付 在确定了以上需求和功能之后,我们可以进行后续开发工作。 2. 创建数据库和数据表 为了存储商品信息、用户信息、订单信息等数据,我们需要创建相应的数据…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部