
Java:多线程-二次复习
多线程的基本知识及代码案例!
@Eleven
一辈子很短,努力的做好两件事就好;第一件事是热爱生活,好好的去爱身边的人;第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱,加油!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
21、线程安全map:ConcurrentHashMap
一、目标创建一个HashMap,创建两个线程,每个线程向map中存储50万条key值不一样的数据,最终map中应该存在100万条数据。二、代码package com.zjl.study.多线程.ConcurrentHashMap;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;/** * Created by zjl 2022/5/29 **/pub原创 2022-05-29 23:54:03 · 198 阅读 · 0 评论 -
20、HashMap并发情况下出现线程安全问题
一、目标创建一个HashMap,创建两个线程,每个线程向map中存储50万条key值不一样的数据,最终map中应该存在100万条数据。二、代码package com.zjl.study.多线程.ConcurrentHashMap;import java.util.HashMap;import java.util.Map;/** * Created by zjl 2022/5/29 **/public class ConcurrentHashMapDemo { public sta原创 2022-05-29 23:48:18 · 523 阅读 · 0 评论 -
19、CAS与Synchronized比较
一、CAS(乐观锁)1、CAS的全称是:Compare And Swap(比较再交换),是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS可以将read-modify-check-write转化为原子操作,这个原子操作直接由处理器保证,也正是因为这个,才保证了原子类的线程安全。2、总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是更新的时候会判断一下在此期间别人有没有更新这个数据,也就是这个数据和我拿的时候的值是否一致。二、Synchronized(悲原创 2022-05-29 22:58:59 · 641 阅读 · 0 评论 -
18、保证原子性操作方案二:使用原子类(CAS机制)
一、什么是原子性原子性,是指一批操作是一个整体,要么同时成功,要么同时失败,不能被干扰。二、使用原子类保证原子性代码案例。package com.zjl.study.多线程.volatile不能保证原子性案例;import java.util.concurrent.atomic.AtomicInteger;/** * Created by zjl 2022/5/29 **/public class VolatileAtomic { public static void main(S原创 2022-05-29 18:03:44 · 158 阅读 · 0 评论 -
17、保证原子性操作方案一:加锁
一、什么是原子性原子性,是指一批操作是一个整体,要么同时成功,要么同时失败,不能被干扰。二、使用加锁方式保证原子性代码案例。package com.zjl.study.多线程.volatile不能保证原子性案例;/** * Created by zjl 2022/5/29 **/public class VolatileAtomic { public static void main(String[] args) { // 1、创建1个线程任务 MyRunnable m原创 2022-05-29 17:55:00 · 342 阅读 · 0 评论 -
16、案例:volatile修饰变量并不能保证原子性
一、什么是原子性原子性,是指一批操作是一个整体,要么同时成功,要么同时失败,不能被干扰。二、volatile修饰变量并不能保证原子性代码案例。package com.zjl.study.多线程.volatile不能保证原子性案例;/** * Created by zjl 2022/5/29 **/public class VolatileAtomic { public static void main(String[] args) { // 1、创建1个线程任务 MyR原创 2022-05-29 16:04:21 · 257 阅读 · 0 评论 -
15、volatile关键字和synchronized区别
volatile关键字和synchronized区别如下:1、volatile关键字只能修饰实例变量和类变量,而synchronized关键字可以修饰方法和代码块。2、volatile可以保证数据的可见性,但是并不保证原子性,也就是说并不能保证线程安全;而synchronized是一种排他的机制,可以实现线程安全。...原创 2022-05-29 15:18:58 · 114 阅读 · 0 评论 -
14、解决多线程下变量不可见性问题:volatile关键字
一、前言多个线程访问共享变量,会出现一个线程修改变量值后,其他线程看不到最新值的情况,给共享变量加上volatile关键字,能解决这一问题。二、代码package com.zjl.study.多线程.volatile关键字;/** * Created by zjl 2022/5/29 **/public class 多线程下变量不可见性问题 { public static void main(String[] args) { // 1、启动子线程,将线程中的flag值改为true原创 2022-05-29 15:07:54 · 251 阅读 · 0 评论 -
12、案例:多线程下变量不可见性问题
一、前言多个线程访问共享变量,会出现一个线程修改变量值后,其他线程看不到最新值的情况。二、代码package com.zjl.study.多线程.volatile关键字;/** * Created by zjl 2022/5/29 **/public class 多线程下变量不可见性问题 { public static void main(String[] args) { // 1、启动子线程,将线程中的flag值改为true VolatileThread thread原创 2022-05-29 00:23:06 · 291 阅读 · 1 评论 -
11、死锁的必然案例
一、死锁的必要条件1、互斥使用:即当一个资源被一个线程使用(占用)时,别的线程不能使用。2、不可抢占:资源请求者不能强制从资源占有者中夺取资源,资源只能由资源占有者主动释放。3、请求和保持:当资源请求者在请求其他资源的同时,保持对原有资源的占有。4、循环等待:即存在一个等待循环队列:T1要T2的资源,T2要T1的资源。二、代码package com.zjl.study;/** * Created by zjl 2022/5/23 **/public class 必然死锁的实现 {原创 2022-05-28 23:57:16 · 99 阅读 · 0 评论 -
10、创建线程池:Callable做线程池任务
一、代码package com.zjl.study;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/** * Created by zjl 2022/5/23 * <p> * 需求,使用线程池,计算1-100,,1-原创 2022-05-28 22:21:59 · 381 阅读 · 0 评论 -
9、创建线程池:Runnable做线程池任务
一、代码package com.zjl.study;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Created by zjl 2022/5/23 **/public class Runnable实现线程池 { public static void main(String[] args) { // 创建线程池,指定线程数量为3 Execu原创 2022-05-28 22:19:33 · 606 阅读 · 0 评论 -
8、线程池的参数讲解
一、查看创建线程池底层的源码,即ThreadPoolExecutor.java里面的构造方法,如下所示:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,原创 2022-05-28 22:15:19 · 274 阅读 · 0 评论 -
7、线程同步方式三:使用Lock锁
一、模拟场景1、提供一个账户类Account.java作为创建共享资源账户对象的类。2、定义一个线程类,创建两个线程小红和小明,同时在一个账户上取钱。3、使用Lock锁避免出现从账户中多取钱的现象。二、代码1、账户类package com.zjl.study.多线程.线程安全问题模拟;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * Created原创 2022-05-28 21:33:07 · 115 阅读 · 0 评论 -
6、线程同步方式二:同步方法
一、模拟场景1、提供一个账户类Account.java作为创建共享资源账户对象的类。2、定义一个线程类,创建两个线程小红和小明,同时在一个账户上取钱。3、使用同步方法避免出现从账户中多取钱的现象。二、代码1、账户类package com.zjl.study.多线程.线程安全问题模拟;/** * Created by zjl 2022/5/28 **/public class Account { private String cardId; private double mo原创 2022-05-28 21:07:08 · 109 阅读 · 0 评论 -
5、线程同步方式一:同步代码块
一、模拟场景1、提供一个账户类Account.java作为创建共享资源账户对象的类。2、定义一个线程类,创建两个线程小红和小明,同时在一个账户上取钱。3、使用同步代码块避免出现从账户中多取钱的现象。二、代码1、账户类package com.zjl.study.多线程.线程安全问题模拟;/** * Created by zjl 2022/5/28 **/public class Account { private String cardId; private double mo原创 2022-05-28 20:56:41 · 133 阅读 · 0 评论 -
4、线程安全问题的案例:银行取钱问题
一、模拟场景1、提供一个账户类Account.java作为创建共享资源账户对象的类。2、定义一个线程类,创建两个线程小红和小明,同时在一个账户上取钱。3、会出现从账户中多取钱的现象。二、代码1、账户类package com.zjl.study.多线程.线程安全问题模拟;/** * Created by zjl 2022/5/28 **/public class Account { private String cardId; private double money;原创 2022-05-28 20:31:04 · 581 阅读 · 0 评论 -
3、创建线程方式三:实现Callable接口
一、步骤1、定义一个线程任务类实现Callable接口,声明线程执行的结果类型。2、重写线程任务类的call()方法,这个方法可以直接返回执行的结果。3、创建一个Callable的线程任务对象。4、把Callable的线程任务对象包装成一个未来任务对象。5、把未来任务对象包装成线程对象。6、调用线程start()方法,启动线程。7、获取线程执行结果。二、代码package com.zjl.study.多线程;import java.util.concurrent.Callable;i原创 2022-05-28 18:31:08 · 2755 阅读 · 0 评论 -
2、创建线程方式二:实现Runnable接口
一、步骤1、创建线程任务类实现Runnable接口。2、重写run()方法。3、创建一个线程任务对象。4、把线程任务对象包装成线程对象。5、调用线程对象的start()方法启动线程。二、代码package com.zjl.study.多线程;/** * Created by zjl 2022/5/28 **/public class 创建线程方式2 { public static void main(String[] args) { // 3、创建一个线程任务对象原创 2022-05-28 17:23:09 · 764 阅读 · 0 评论 -
1、创建线程方式一:继承thread类
一、代码package com.zjl.study.多线程;/** * Created by zjl 2022/5/26 **/public class 线程创建方式1 { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); for (int i = 0; i < 100; i++) { System.out原创 2022-05-26 22:18:12 · 600 阅读 · 0 评论