java面试(并发)

java线程概念,安全?

进程是系统分配资源的最小单元,线程是操作系统调度的最小单位。线程属于进程。

加锁保证安全。1.JVM提供Synchronized关键字,2.jdk提供各种lock锁

实现多线程方式?

1.继承Thread类,重写run方法:线程执行完没有返回值。本质是实现Runnable接口的一个实例。调用Thread.start()启动

2.实现Runnable接口,实现trun方法:线程执行完没有返回值。需先实例化一个Thread,并传入自己的实例。

3.使用ExecutorService,Callable,Future实现:有返回结果的多线程。执行callable会获取Future对象调用其get方法获取返回Object即可

4.使用线程池。?

ThreadPool{
	int taskSize = 5;
	ExecutorService pool = Excutors.newFixedThreadPool(taskSize);
	List<Future> list = new ArrayList<Future> {  //创建多个有返回值的任务
		for(int i = 0;i < taskSize; i++) {
			Callable c = new MyCallable(i + "");
			Future f = pool.submit(c);  //执行任务获取Future对象
			list.add(f);
		}
		poll.shutdown();
	}
}

class MyCallable implements Callable<Object> {
	private String taskName;
	MyCallable(String taskName) {
		this.taskNum = taskNum;
	}
}

Volatile和Synchronized有什么区别?Volatile能保证安全吗?DCL实现单例为什么要加Volatile?

1.volatile:保持变量的内存(线程)可见性,避免编译器优化,适用于一个线程写,一个读的场景。

synchronized:关键字,用来加锁。

2.不安全,没有原子性。

3.volatile防止指令重排(多核CPU底层指令执行顺序的优化)。在DCL中,防止高并发下指令重排造成线程安全问题。

public class singleTon{
	private static SingleTon sinaleTon = new SingleTon();  //static,启动时就创建好私有对象
	private SingleTon(){}
	public static SingleTon getSingleTon(){
		if(null == singleTon) {
			synchronized(SingleTon.class) {
				if(null == singleTon) {
					sinaleTon = new SingleTon();
				}
			}
		}
		return singleTon;
	}
}

Java线程锁机制?偏向,轻量级重量级锁区别?锁升级?

扩展maven插件:org.openjdk.jol.jol-core:把java对象在内存中的布局打印出来。

Object bean = new Object();
sout(ClassLayout.parse(bean).toPrintable());
synchornized(bean);
sout(ClassLayout.parse(bean).toPrintable());

1.java锁:可看出加锁只是在对象头部markword上做一个锁状态标记。无锁,偏向锁,轻重量级锁对应不同锁状态。
锁标志
2.java锁机制:就是根据资源竞争程度不断进行锁升级的过程。
扩展jvm底层参数:-XX:UsedBiasedLocking:是否打开偏向锁,默认不打开 -XX:BiasedLockingStartupDelay:默认4s,打开
锁升级

AQS理解,AQS怎么实现可重入锁?

1.AQS是java线程同步的框架,是jdk中很多锁的核心实现框架。AQS中维护了一个信号量state和一个线程组成的双向链表队列。state用来控制线程排队或放行。
2.在可重入锁的场景下,state就用来表示加锁的次数。0表示无锁,加一次锁state+1,释放-1。
例子:手写一个MyReentrantLock。
aqs

有A,B,C三个线程,如何保证三线程同步执行?并发下依次执行?有序交错执行?

主要考三个并发工具:CountDownLatch(倒数同步栅栏),CylicBarrier(计数同步栅栏),Semaphore(满足信号量<个数>后执行)。

1.线程同步执行
int size = 3;
CountDownLatch count = new CountDownLatch();
for(int i = 0; i < size; i++) {  //可模拟高并发场景
	new Thread(() -> {
		count.await();  //所有线程排队,等待主线程倒数
	}).start();
}
Thread,sleep(5000);  //线程准备
count.countDown();
2.线程依次执行
static volatile int sem = 1;  //信号量,加volatile为了让其他线程感知到sem变化
Thread t1 = new Thread(() -> {while(true){if(sem==1) sout(a); sem = 2; return;}});
Thread t2 = new Thread(() -> {while(true){if(sem==2) sout(a); sem = 3; return;}});
Thread t3 = new Thread(() -> {while(true){if(sem==3) sout(a); sem = 1; return;}});
3.交错执行
private static Semaphore s1 = new Semaphore(1);
private static Semaphore s2 = new Semaphore(1);
private static Semaphore s3 = new Semaphore(1);
s1.acquire();
s2.acquire();
new Thread(() -> {while(true){s1.acquire(); sout("A"); s2.release();}}).start();
new Thread(() -> {while(true){s2.acquire(); sout("B"); s3.release();}}).start();
new Thread(() -> {while(true){s3.acquire(); sout("C"); s1.release();}}).start();

如何对一个字符串快速排序

思路:fork/join框架,实例:https://blog.csdn.net/qq_40100414/article/details/119202893 ; https://blog.csdn.net/u011294519/article/details/88368142
分治

private static int inits[] = new int[100];
Random r = new Random();
for(int index = 1;index < 100; index++) {
	inits[index - 1] = r,nextInt(1000);
}

ForkJoinPool pool = new ForkJoinPool();
MyTask task = new MyTask(inits);
ForkJoinTask<int[]> taskResult = pool.submit(task);
int[] ints = taskResult.get();
sout(Arrays.toString(ints));

class MyTask extends RecursiveTask<int[]> {
	private int source[];
	protected int[] compute() {
		int sourceLen = source.length;
		if(sourceLen > 2) {  //如果数组长度大于2,说明任务中要进行排序的集合还不够小
			int midIndex = sourceLen / 2;
			//拆分成2个任务
			MyTask task1 = new MyTask(Arrays.copyOf(source, midIndex));
			task1.fork();
			MyTask task2 = new MyTask(Arrays.copyOfOfRange(source, midIndex, sourceLen));
			task2.fork();
			//将2个有序的数组,合并成一个有序数组
			int result1[] task1.join();
			int result2[] task2.join();
			int mer[] joinInts(result,result2);
			return mer;
		} else {  //拆分剩1,2个了开始合并
			if(sourceLen == 1 || source[0] <= source[1]) {  //只有一个元素
				return source;
			} else {
				int targetp[] = new int[sourthlen];
				targetp[0] = source[1];
			}
		}
	}
}
int[] joinInts(int arr1[], int arr2[]) {
	int destInts[] new int[arr1.length + arr2.length];
	int array1Len = array1.length;
	int array2Len = array2.length;
	int destLen = destInts.length;
    // 只需要以新的集合destInts的长度为标准,遍历一次即可
    for (int index = 0, array1Index = 0, array2Index = 0; index < destLen; index++) {
        int value1 = array1Index >= array1Len ? Integer.MAX_VALUE : array1[array1Index];
        int value2 = array2Index >= array2Len ? Integer.MAX_VALUE : array2[array2Index];
        // 如果条件成立,说明应该取数组array1中的值
        if (value1 < value2) {
            array1Index++;
            destInts[index] = value1;
        }
        // 否则取数组array2中的值
        else {
            array2Index++;
            destInts[index] = value2;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/408688.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【奥威-金蝶云星空BI方案】你要的报表,这里都有!

用金蝶云星空来记账&#xff0c;那确实好&#xff0c;但如果让你再去做一份详细的报表呢&#xff1f;自己开发的话&#xff0c;成本大、耗时长&#xff0c;一旦有了新的需求又要一再开发&#xff0c;长此以往将增加使用者使用难度&#xff0c;降低数据分析对运营决策的时效性。…

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024)

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024) 会议简介 能源动力、机械自动化和航空航天技术国际学术会议&#xff08;ICEPMAT2024&#xff09;将于2024年在北京举行。会议将探讨能源动力、机械自动化、航空航天技术领域的新研究热点、核心技术和发展趋…

迷你世界之建筑生成球体

local x0,y0,z00,30,0--起点坐标 local dx,dy,dz60,60,60--外切长方体横纵竖长度 local count,all0,dx*dy*dz--计数&#xff0c;总数 local m,k10000,0--单次生成方块数&#xff0c;无用循环值 local x,y,z0,0,0--当前坐标 local demath.random(2,19)/2 local id600--方块…

在openEuler中通过KVM可视化安装华为FusionCompute的CNA主机

一、环境说明 在Windows物理主机上通过VMware WorkStation创建一个虚拟机&#xff08;4U4C、16GB内存&#xff0c;400GB磁盘&#xff0c;NAT网络连接&#xff09;&#xff0c;在虚拟机中安装openEuler 22.03 LTS系统&#xff0c;并将该虚拟机作为部署 FusionCompute的服务器&a…

【Linux】 yum命令使用

yum命令 yum&#xff08; Yellow dog Updater, Modified&#xff09; 是一个在 Fedora、CentOS 及其它一些基于 RPM 的 Linux 发行版中使用的包管理器。它允许用户自动安装、更新、配置和删除软件包。yum 由 Python 写成&#xff0c;基于 RPM&#xff08;Red Hat Package Mana…

【C语言】linux内核ipoib模块 - ipoib_tx_poll

一、中文注释 这段代码是 Linux 内核网络栈中与 InfiniBand 协议相关的一个部分&#xff0c;特别是与 IP over InfiniBand (IPoIB)相关。该函数负责去处理IPoIB的发送完成队列&#xff08;发送CQ&#xff09;上的工作请求&#xff08;work completions&#xff09;。以下是对这…

微信小程序开发(实战案例):本地生活 - 列表页面开发(动态渲染处理)、节流防抖(节流阀应用)

文章目录 本地生活 - 列表页面开发一、将九宫格分类换成navigator组件二、动态设置商品列表页的 title三、动态渲染商品列表页面四、上拉触底加载数据五、添加Loading加载效果六、数据加载节流防抖处理 本地生活 - 列表页面开发 导入我们上次写的 本地生活 - 首页开发的项目 运…

MySQL数据库调优之关联查询、排序查询、分页查询、子查询、Group by优化

关联查询优化 1.准备工作 CREATE TABLE IF NOT EXISTS type(id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,card INT(10) UNSIGNED NOT NULL,PRIMARY KEY(id));CREATE TABLE IF NOT EXISTS book( bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED N…

李宏毅2023机器学习作业1--homework1——python语法

# 定义list del_col del_col [0, 38, 39, 46, 51, 56, 57, 64, 69, 74, 75, 82, 87] # 删除raw_x_train中del_col的列&#xff0c;axis为1代表删除列 raw_x_train np.delete(raw_x_train, del_col, axis1) # numpy数组增删查改方法 # 定义列表get_col get_col [35, 36, 37,…

openssl3.2 - 编译 - zlib.dll不要使用绝对路径

文章目录 openssl3.2 - 编译 - 编译时的动态库zlib.dll不要使用绝对路径概述测试zlib特性在安装好的目录中是否正常笔记70-test_tls13certcomp.t80-test_cms.t对测试环境的猜测从头再编译测试安装一次测试一下随便改变位置的openssl用到zlib时是否好使测试一下随便改变位置的op…

【爬虫逆向实战篇】定位加密参数、断点调试与JS代码分析

文章目录 1. 写在前面2. 确认加密参数3. 加密参数定位4. XHR断点调试 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向…

实战一个 Jenkins 构建 CI/CD流水线 的简单配置过程哈

引言&#xff1a;上一期我们讲述了gitlabCI/CD工具的介绍&#xff0c;工具之争&#xff0c;本期我们介绍Jenkins CI/CD 目录 一、Jenkins介绍 1、Jenkins概念 2、Jenkins目的 3、特性 4、产品发布流程 二、安装Jenkins 1、安装JDK 2、安装Jenkins 1、上传压缩包 2、…

(done) 如何判断一个矩阵是否可逆?

参考视频&#xff1a;https://www.bilibili.com/video/BV15H4y1y737/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这个视频里还暗含了一些引理 1.若 AX XB 且 X 和 A,B 同阶可逆&#xff0c;那么 A 和 B 相似。原因&#xff1…

北航复试知识点总结

2024.2.25 住行 报道+机试+两天面试=4天 面试流程 (每个人大概20min,早一点到考场!) 形式:5位老师(一记录,四提问) 老师 陆峰 办公地址:北京航空航天大学新主楼H1033 电子邮箱: lufeng@buaa.edu.cn 个人主页:http://shi.buaa.edu.cn/lufeng/ 面试礼仪 于无形中…

编曲学习:高叠和弦 挂留和弦 和弦实战应用

高叠和弦 挂留和弦 和弦实战应用小鹅通-专注内容付费的技术服务商https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65d4826fe4b04c10a1310517?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 七和弦 以三和弦举例,三和弦上面叠一个三度的音,就变成了七和弦。 从下到…

Spring Boot利用Kaptcha生成验证码

生成验证码 我们在登录或注册某个网站的时候&#xff0c;会需要我们输入验证码&#xff0c;才能登录注册&#xff0c;那么如何生成验证码呢&#xff1f;其实&#xff0c;生成验证码我们可以用Java Swing在后台内存里的区域画一个出来&#xff0c;但是非常麻烦&#xff0c;所以…

WIFI EEPROM 简略分析-MT7628 EEPROM ANALYSIS

经常做WIFI的同学都了解,硬件设计完成后经过射频的测试满足设计要求后,在量产以及生产中都需要对WIFI的射频需要校准,保证产品射频输出功率的一致性。 在开发阶段就必须需要了解WIFI的EEPROM都是一些什么参数,一般在硬件开发阶段会拿到芯片厂家都SDK,里面都包含对EEPROM的…

用什么软件制作电子杂志

想要制作高大上的电子杂志&#xff1f;别再烦恼啦&#xff01;今天给大家推荐一款超级实用的软件&#xff0c;让你轻松制作出专业水准的电子杂志&#xff01; 这款软件功能强大&#xff0c;操作简单&#xff0c;适合所有对设计感兴趣的小伙伴们。无论是新手还是专业设计师&…

代码随想录算法训练营第二十五天 | 216.组合总和III,17.电话号码的字母组合 [回溯篇]

代码随想录算法训练营第二十五天 LeetCode 216.组合总和III题目描述思路参考代码总结 LeetCode 17.电话号码的字母组合题目描述思路参考代码 LeetCode 216.组合总和III 题目链接&#xff1a;216.组合总和III 文章讲解&#xff1a;代码随想录#216.组合总和III 视频讲解&#xff…

javascript监听浏览器离开、进入行为

document.addEventListener(visibilitychange, () > {if (document.visibilityState hidden) {alert(离开)}if (document.visibilityState visible) {alert(进入)}}) visibilitychange是浏览器新添加的一个事件&#xff0c;当其选项卡的内容变得可见或被隐藏时&#xff0…
最新文章