当前位置:网站首页>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<>();
}

边栏推荐
猜你喜欢
随机推荐
安装mysql-workbench
Logic Pro X自带音色库列表
熊市中预言机,牛市中的战斗机,藏宝计划起飞,坐稳扶好!
ArcEngine(二)加载地图文档
第十二天&接口和协议
牛客 - 鼠标的天选(字符串哈希)
sqlserver2019安装失败
RViz报错: Error subscribing: Unable to load plugin for transport ‘compressed‘解决方法
day12---接口和协议
Exch:重命名或删除默认邮箱数据库
Docker starts mysql
sqlite date field plus one day
AI中台序列标注任务:三个数据集构造过程记录
LeetCode 每日一题——622. 设计循环队列
热部署系统实现
MySQL2
ArcEngine (1) Loading vector data
thop 使用心得
Using pipreqs export requirements needed for the project. TXT (rather than the whole environment)
10分钟带你入门chrome(谷歌)浏览器插件开发








