当前位置:网站首页>scala 并行集合、并行并发、线程安全问题、ThreadLocal
scala 并行集合、并行并发、线程安全问题、ThreadLocal
2022-08-03 08:30:00 【但行益事莫问前程】
1. scala并行集合
Scala提供并行集合,用于多核环境的并行计算,充分使用多核CPU
object T34 {
def main(args: Array[String]): Unit = {
val result = (0 to 20).par.map {
x => Thread.currentThread.getName }
println(result)
}
}
并行
:两个或多个事件在同一时刻点发生
(多核CPU)并发
:两个或多个事件在同一时间段内发生
(多线程竞争资源)
2. 线程安全问题
多线程并发修改,对共享内存中共享对象属性进行修改
所导致的数据冲突问题
public class T45 {
public static void main(String[] args) {
User user = new User();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
user.name = "zs";
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(user.name);
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
user.name = "lisi";
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(user.name);
}
});
thread1.start();
thread2.start();
System.out.println("main");
}
}
class User {
public String name;
}
3. ThreadLocal
ThreadLocal中填充的变量属于当前线程,对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本
,每个线程访问自己内部的副本变量。因此不存在线程安全问题
public class T45 {
public static void main(String[] args) {
User user = new User();
//线程安全问题: 多线程并发修改,对共享内存中共享对象属性进行修改所导致的数据冲突问题
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
user.name.set("zs");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(user.name.get());
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
user.name.set("lisi");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(user.name.get());
}
});
thread1.start();
thread2.start();
System.out.println("main");
}
}
class User {
public ThreadLocal<String> name=new ThreadLocal<>();
}
边栏推荐
- Eject stubborn hard drives with diskpart's offline command
- ArcEngine (3) zoom in and zoom out through the MapControl control to achieve full-image roaming
- 0day_Topsec上网行为管理RCE
- window的供选数据流
- The use of the database table structure document generation tool screw
- Redisson实现分布式锁
- 牛客 - 鼠标的天选(字符串哈希)
- Docker starts mysql
- Laya中关于摄像机跟随人物移动或者点击人物碰撞器触发事件的Demo
- 数据监控平台
猜你喜欢
随机推荐
长短期记忆网络 LSTM
合并两个有序链表
greenplum role /user 管理
10分钟带你入门chrome(谷歌)浏览器插件开发
【论文笔记】一种基于启发式奖赏函数的分层强化学习方法
Docker启动mysql
HCIA实验(07)
Evaluate:huggingface评价指标模块入门详细介绍
The use of the database table structure document generation tool screw
实时目标检测新高地之#YOLOv7#更快更强的目标检测器
rust 学习笔记
线程介绍与使用
ArcEngine(八)用IWorkspaceFactory加载矢量数据
2022下半年软考「高项&集成」复习计划ta来喽~
ArcEngine(六)用tool工具实现拉框放大缩小和平移
vim 折叠函数
pytorch one-hot 小技巧
【TPC-DS】25张表的详细介绍,SQL的查询特征
Unity编辑器扩展批量修改图片名称
Charles抓包工具学习记录