首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第一章:相关概念
1.1 并发和并行
1.2 进程和线程
1.3 线程调度
1.4 多线程的应用场景
第二章:线程的创建和使用
2.1 概述
2.1 JDK 5之前创建线程的方式
2.1.1 概述
2.1.2 继承 Thread 类
2.1.3 实现 Runnable 接口
2.1.4 继承方式和实现方式的区别
2.2 设置线程名称和获取线程名称
2.3 线程的优先级
第三章:线程安全
3.1 售票程序引出线程安全
3.2 线程安全的原因
3.3 线程安全的解决方法
3.4 JDK 5 之前解决线程安全
3.4.1 概述
3.4.2 同步机制的原理
3.4.3 同步机制中的锁
3.4.4 应用示例
3.5 JDK 5 之后解决线程安全
3.6 死锁
3.7 synchronized 与 Lock 的对比
第四章:线程通信
4.1 为什么需要线程通信?
4.2 等待唤醒机制
4.3 生产者和消费者问题
4.4 sleep() 和 wait() 方法的区别
4.5 生产者和消费者性能问题
4.6 Lock 接口的深入
第五章:单例设计模式
5.1 概述
5.2 单例模式
第六章:线程池
6.1 概述
6.2 线程池相关的API
6.3 实现 Callable 接口
6.4 ThreadPoolExecutor
第七章:线程的生命周期
第八章:volatile 关键字
8.1 概述
8.2 应用示例
第九章:原子性
9.1 概述
9.2 AtomicInteger
9.2.1 常用方法
9.2.2 原理
9.2.3 源码解析
9.3 synchronized 和 CAS 的区别
第十章:并发工具类
10.1 Hashtable
10.2 ConcurrentHashMap
10.3 CountDownLatch
10.4 Semaphore
当前位置:
首页>>
技术小册>>
Java语言基础8-Java多线程
小册名称:Java语言基础8-Java多线程
构造方法: ```bash public AtomicInteger() { } public AtomicInteger(int initialValue) { value = initialValue; } ``` 获取值: ```bash public final int get() {} ``` 以原子方式将当前值值加1,返回的是自增前的值: ```bash public final int getAndIncrement() {} ``` 以原子方式将当前值加1,返回的是自增后的值: ```bash public final int incrementAndGet() {} ``` 以原子方式将输入的数值和实例中的值( AtomicInteger 里的 value )相加,并返回新值: ```bash public final int addAndGet(int delta) {} ``` 以原子方式设置为 newValue 的值,并返回旧值: ```bash public final int getAndSet(int newValue) {} ``` 示例: ```bash package com.github.demo14; import java.util.concurrent.atomic.AtomicInteger; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { AtomicInteger a1 = new AtomicInteger(); System.out.println("a1 = " + a1); // a1 = 0 AtomicInteger a2 = new AtomicInteger(10); System.out.println("a2 = " + a2); // a2 = 10 } } ``` 示例: ```bash package com.github.demo14; import java.util.concurrent.atomic.AtomicInteger; /** * @author maxiaoke.com * @version 1.0 * */ public class Test1 { public static void main(String[] args) { AtomicInteger a1 = new AtomicInteger(10); int i = a1.get(); System.out.println("a1 = " + a1); // a1 = 10 System.out.println("获取值 = " + i); // 获取值 = 10 int andDecrement = a1.getAndIncrement(); System.out.println("a1 = " + a1); // a1 = 11 System.out.println("以原子的方式将当前值加1,返回的是旧值 = " + andDecrement); // 以原子的方式将当前值加1,返回的是旧值 = 10 a1 = new AtomicInteger(10); int incrementAndGet = a1.incrementAndGet(); System.out.println("a1 = " + a1); // a1 = 11 System.out.println("以原子的方式将当前值加1,返回的是新值 = " + incrementAndGet); // 以原子的方式将当前值加1,返回的是新值 = 11 a1 = new AtomicInteger(10); int andSet = a1.getAndSet(5); System.out.println("a1 = " + a1); // a1 = 5 System.out.println("以原子的方式设置为newValue的值,返回的是旧值 = " + andSet); //以原子的方式设置为newValue的值,返回的是旧值 = 10 a1 = new AtomicInteger(10); int addAndGet = a1.addAndGet(5); System.out.println("a1 = " + a1); // a1 = 15 System.out.println("以原子的方式将参数和对象中的值相加,返回新值 = " + addAndGet); // 以原子的方式将参数和对象中的值相加,返回新值 = 15 } } ``` 示例:使用 AtomicInteger 来解决原子性问题 ```bash package com.github.demo15; import java.util.concurrent.atomic.AtomicInteger; /** * @author maxiaoke.com * @version 1.0 * */ public class SubRunnable implements Runnable { private AtomicInteger ac = new AtomicInteger(); @Override public void run() { for (int i = 0; i < 100; i++) { int count = this.ac.incrementAndGet(); System.out.println("已经送了" + count + "个冰淇淋"); } } } ``` ```bash package com.github.demo15; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { Runnable r = new SubRunnable(); for (int i = 0; i < 100; i++) { new Thread(r).start(); } } } ```
上一篇:
9.2 AtomicInteger
下一篇:
9.2.2 原理
该分类下的相关小册推荐:
Java语言基础12-网络编程
Mybatis合辑1-Mybatis基础入门
Java语言基础3-流程控制
Java并发编程
Java语言基础4-数组详解
Mybatis合辑3-Mybatis动态SQL
深入拆解 Java 虚拟机
Java语言基础7-Java中的异常
手把手带你学习SpringBoot-零基础到实战
Java语言基础16-JDK8 新特性
SpringBoot合辑-高级篇
Mybatis合辑2-Mybatis映射文件