面试360问(二)——多线程面试

本地线程:

1.ThreadLocal是什么
ThreadLocal正如他的中文翻译 线程本地变量所说,顾名思义,就是每个线程自己的本地变量。简单的来说,就是在多线程的程序中,我们一般会申请共享变量。给所有线程使用。但是很多情况下,每个线程会对共享变量进行改变。比如,一个String 类型的static变量,线程一将String 赋值为 “线程一”,然后在跑其他的逻辑的时候,第二个线程将String 又改成了“线程二”,那么就会出个问题,线程一跑到后面在对该String进行使用的时候,就发现值已经被改变了。
ThreadLocal的价值就体现了出来。就是在每个线程里面对变量单独记录保存。这样,线程二对String的改变就是对自己内部改变,不会影响别的线程中的String值。

        针对这个,写个代码进行了一个测试,方便理解。

package zxy.maven.product;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

//
public class ThreadTest {
// threadLocal Test
public static ThreadLocal threadLocal = new ThreadLocal();

public static String baseString ="";


public static ExecutorService  executorService=Executors.newFixedThreadPool(4);


private static void setTLocal(String value) {
	threadLocal.set(value);
}

private static String getTlocal() {
	return "ThreadLocal保存:"+Thread.currentThread().getName()+" : "+ threadLocal.get();
}

private static void setBLocal(String value) {
	baseString=value;
}

private static String getBlocal() {
	return "Baseocal保存:   "+Thread.currentThread().getName()+" : "+baseString;
}



public static void main(String[] args) throws InterruptedException {

	Thread thread=new Thread(new Runnable() {
		public void run() {
			setTLocal("子线程一保存变量");
			try {
				//睡眠一秒,模拟在处理某些程序
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(getTlocal());
		}
	});
	
	Thread thread2=new Thread(new Runnable() {
		public void run() {
			setTLocal("子线程二保存变量");
			System.out.println(getTlocal());
		}
	});
	
	executorService.execute(thread);
	executorService.execute(thread2);
	
	setTLocal("主线程保存变量");
	System.out.println(getTlocal());
	
	Thread.sleep(1000);
	
	
	
	Thread thread3=new Thread(new Runnable() {
		public void run() {
			setBLocal("子线程一保存变量");
			try {
				//睡眠一秒,模拟在处理某些程序
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.err.println(getBlocal());
		}
	});
	
	Thread thread4=new Thread(new Runnable() {
		public void run() {
			setBLocal("子线程二保存变量");
			System.err.println(getBlocal());
		}
	});
	
	executorService.execute(thread3);
	executorService.execute(thread4);
	
	setBLocal("主线程保存变量");
	System.err.println(getBlocal());	
}	

}
在这里插入图片描述
看到结果,ThreadLocal保存的变量没有因为其他原因改变。但是Basecal的变了,因为当执行的时候,主线程执行完了输出,线程一将String 修改为“子线程一保存变量”,进入睡眠,线程二进行修改,改String 为子线程二,这时候输出的时候,就变成了两个子线程二了。

                如此就体现了ThreadLocal的价值,就是保证线程之间的变量处理互不影响

锁Lock:

提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句


Synchronized和Lock有什么区别:

提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句


线程池都有哪些参数:

提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句


线程池增加一个任务在线程池内部是怎么判断的:

提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句


重入锁:

提示:这里可以添加计划学习的时间
例如:
1、 周一至周五晚上 7 点—晚上9点
2、 周六上午 9 点-上午 11 点
3、 周日下午 3 点-下午 6 点


有哪些线程安全的集合and怎么创建线程安全的集合:

提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个

volatile变量:

提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值