java容易掉发吗_容易被忽略的面试题—Java高并发

常见实现如CAS等。

部分乐观锁削弱了一致性,但中低并发程度下的效率大大提高。

并发编程

Java中如何创建一个线程?

从面相接口的角度上讲,实际上只有一种方法实现Runable接口;但Thread类为线程操作提供了更多的支持,所以通常做法是实现Runable接口,实例化并传入Thread类的构造函数。

继承Thread,覆写run方法

实现Runable接口,覆写run方法

继承Thread,覆写run方法

实现Runable接口,覆写run方法

Vector(HashTable)如何实现线程安全?

通过synchronized关键字修饰每个方法。

依据synchronized关键字引申出以下问题。

synchronized修饰方法和修饰代码块时有何不同?

持有锁的对象不同:

修饰方法时:this引用的当前实例持有锁

修饰代码块时:要指定一个对象,该对象持有锁

修饰方法时:this引用的当前实例持有锁

修饰代码块时:要指定一个对象,该对象持有锁

从而导致二者的意义不同:

同步代码块在锁定的范围上可能比同步方法要小,一般来说锁的范围大小和性能是成反比的。

修饰代码块可以选择对哪个对象加锁,但是修饰方法只能给this对象加锁。

同步代码块在锁定的范围上可能比同步方法要小,一般来说锁的范围大小和性能是成反比的。

修饰代码块可以选择对哪个对象加锁,但是修饰方法只能给this对象加锁。

ConcurrentHashMap的如何实现线程安全?

ConcurrentHashMap的线程安全实现与HashTable不同:

可以将ConcurrentHashMap理解为,不直接持有一个HashMao,而是用多个Segment代替了一个HashMap。但实际实现的Map部分和HashMap的原理基本相同,对脚标取模来确定table[i]所属段,从而对不同的段获取不同的段锁。

每个Segment持有一个锁,通过分段加锁的方式,既实现了线程安全,又兼顾了性能

可以将ConcurrentHashMap理解为,不直接持有一个HashMao,而是用多个Segment代替了一个HashMap。但实际实现的Map部分和HashMap的原理基本相同,对脚标取模来确定table[i]所属段,从而对不同的段获取不同的段锁。

每个Segment持有一个锁,通过分段加锁的方式,既实现了线程安全,又兼顾了性能

实现并发线程的方法

要从最简单的答起,业界最常用的是重点,有新意就放在最后。

1. synchronized关键字

2. 使用继承自Object类的wait、notify、notifyAll方法

3. 使用线程安全的API和集合类:

使用Vector、HashTable等线程安全的集合类

使用Concurrent包中提供的ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等弱一致性的集合类

在Collections类中有多个静态方法,它们可以获取通过同步方法封装非同步集合而得到的集合,如List list = Collection.synchronizedList(new ArrayList())。

使用Vector、HashTable等线程安全的集合类

使用Concurrent包中提供的ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等弱一致性的集合类

在Collections类中有多个静态方法,它们可以获取通过同步方法封装非同步集合而得到的集合,如List list = Collection.synchronizedList(new ArrayList())。

4.使用原子变量、volatile变量等

5. 使用Concurrent包中提供的信号量Semaphore、闭锁Latch、栅栏Barrier、交换器Exchanger、Callable&Future、阻塞队列BlockingQueue等.

6. 手动使用Lock实现基于锁的并发控制

7. 手动使用Condition或AQS实现基于条件队列的并发控制

8. 使用CAS和SPIN等实现非阻塞的并发控制

使用不变类

9. 其他并发模型还没有涉及

从而引申出如下问题:

ConcurrentHashMap的的实现原理

CopyOnWriteArrayList的复制操作发生在什么时机

synchronizedList&Vector的区别

ConcurrentHashMap的的实现原理

CopyOnWriteArrayList的复制操作发生在什么时机

synchronizedList&Vector的区别

synchronizedList的实现中,synchronized关键字修饰代码块;Vector的实现中修饰方法。

synchronizedList只封装了add、get、remove等代码块,但Iterator却不是同步的,进行遍历时要手动进行同步处理;Vector中对Iterator也进行了加锁。

synchronizedList能够将所有List实现类封装为同步集合,其内部持有的仍然是List的实现类(ArrayList/LinkedList),所以除同步外,几乎只有该实现类和Vector的区别。synchronized修饰方法和修饰代码块时有何不同

synchronizedList的实现中,synchronized关键字修饰代码块;Vector的实现中修饰方法。

synchronizedList只封装了add、get、remove等代码块,但Iterator却不是同步的,进行遍历时要手动进行同步处理;Vector中对Iterator也进行了加锁。

synchronizedList能够将所有List实现类封装为同步集合,其内部持有的仍然是List的实现类(ArrayList/LinkedList),所以除同步外,几乎只有该实现类和Vector的区别。synchronized修饰方法和修饰代码块时有何不同

信号量Semaphore、闭锁Latch、栅栏Barrier、交换器

Exchanger、Callable&Future、阻塞队列BlockingQueue的实现原理

ConcurrentLinkedQueue的插入算法

算法核心可概括为两步:

先检测是否是中间状态(SPIN)

再尝试CAS插入

先检测是否是中间状态(SPIN)

再尝试CAS插入

在java中wait和sleep方法的不同?

最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。

为什么wait, notify 和 notifyAll这些方法不在thread类里面?

主要原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

为什么wait和notify方法要在同步块中调用?

Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。还有一个原因是为了避免wait和notify之间产生竞态条件。

为什么你应该在循环中检查等待条件?

处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。

Java线程池中submit() 和 execute()方法有什么区别?

两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中, 而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中,它扩展了Executor接口,其它线程池类像ThreadPoolExecutor和ScheduledThreadPoolExecutor都有这些方法。

volatile 变量和 atomic 变量有什么不同?

Volatile变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不能保证原子性。例如用volatile修饰count变量那么 count++ 操作就不是原子性的。而AtomicInteger类提供的atomic方法可以让这种操作具有原子性如getAndIncrement()方法会原子性的进行增量操作把当前值加一,其它数据类型和引用变量也可以进行相似操作。

为什么Thread类的sleep()和yield ()方法是静态的?

Thread类的sleep()和yield()方法将在当前正在执行的线程上运行。所以在其他处于等待状态的线程上调用这些方法是没有意义的。这就是为什么这些方法是静态的。它们可以在当前正在执行的线程中工作,并避免程序员错误的认为可以在其他非运行线程调用这些方法。

本文整理自 ImportNew

来源:猴子007

(完)

恭喜你今天又获得了新知识

喜讯 :

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java spring mvc api_SpringMVC实现REST API

JSON使用Jackson jar包、RequestBody、ResponseBody注解,达到:1. 请求JSON消息体映射为JAVA对象2. 返回JAVA对象映射为JSON消息体Step 1. 导入Jackson jar包:Step 2. 在Spring MVC配置中加入annotation-driven,该配置可以确保Requ…

java 定义构造器_java的构造器定义以及使用

构造器,是面向对象所特有的概念,是一种特殊的方法,与对象创建有关1、构造器没有返回值类型2、构造器方法名与类名相同,而且可以重载构造器3、构造器不能手动调用,只能在创建对象时自动调用一次4、如果没有在类中定义构…

gateway动态路由_无语!SpringCloud Gateway动态路由之Nacos,我已经讲得很清楚了

前言当我们的网关Gateway程序开发完成之后,需要部署到生产环境,这个时候你的程序不能是单点运行的,肯定是多节点启动(独立部署或者docker等容器部署),防止单节点故障导致整个服务不能访问,网关是对客户端的入口与出口&…

json里面的list数据取不出来_sql盲注的困局:利用DNSlog快速导出数据

对于一个sql注入点来说最幸运的就是支持堆叠注入&#xff0c;最蛋疼的就是盲注&#xff0c;盲注里面难搞的就是基于时间的盲注。我们在本地利用这段代码进行演示<?php error_reporting(0); $link mysqli_connect(localhost,root,root); mysqli_set_charset($link,utf8); m…

python判断文件是否打开_python如何判断一个文件是否处于打开状态?

请问你的是linux吗&#xff1f;如果是linux可以借助/proc来获取。 import os class File(object): def __init__(self, file_path): if not os.path.exists(file_path): raise OSError({file_path} not exist.format(file_path file_path)) self.file_path os.path.abspath(f…

python怎么测试程序_python如何测试程序

测试函数是用于自动化测试&#xff0c;使用python模块中的unittest中的工具来测试 附上书中摘抄来的代码&#xff1a;#codingutf-8 import unittest from name_function import get_formatted_name class NamesTestCase(unittest.TestCase): def test_first_last_name(self): f…

判定覆盖白盒测试java_白盒测试系列(四)条件判定覆盖

条件判定覆盖一、定义&#xff1a;程序中每个判定至少有一次为真值&#xff0c;有一次为假值,使得程序中每个分支至少执行一次&#xff0c;且使得各判定中的每个条件获得各种可能的取值至少满足一次。二、特点&#xff1a;1、综合了条件覆盖和判定覆盖的特点2、满足条件判定覆盖…

discard python_Netty入门教程(一) 实现DISCARD服务

官方那个给出的介绍是&#xff1a;Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。然后我们简单理解一下&#xff0c;这玩意就是个程序&#xff0c;干什么的&am…

python 每天执行一次_python 定时器每天就执行一次的实现代码

1.实现功能编写python脚本一直运行&#xff0c;判断当下是否是新的一天&#xff0c;如果是就执行一次任务代码2.具体实现代码#-*-coding:utf-8 -*-__author__ Administratorimport os,threading,timecurTimetime.strftime("%Y-%M-%D",time.localtime())#记录当前时间…

python 类的内置方法_【转】[python] 类常用的内置方法

原文&#xff1a;http://xukaizijian.blog.163.com/blog/static/170433119201111894228877/ 内置方法 说明 __init__(self,...) 初始化对象&#xff0c;在创建新对象时调用 __del__(self) 释放对象&#xff0c;在对象被删除之前调用 __new__(cls,*args,**kwd) 实例的生成操作 _…

java 文件与base64_java之文件与base64字符之间的相互转换

package cn.xuanyuan.util;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public class FileUitl {/*** 将文件转成base64 字符串* param path文件路径* return ** thro…

python向量化编程技巧_神经网络基础之Python与向量化

Vectorization 深度学习算法中&#xff0c;数据量很大&#xff0c;在程序中尽量减少使用loop循环语句&#xff0c;而可以使用向量运算来提高程序运行速度。 向量化(Vectorization)就是利用矩阵运算的思想&#xff0c;大大提高运算速度。例如下面所示在Python中使用向量化要比使…

java 父子线程 调用链_ZipKin原理学习--Zipkin多线程及线程池中追踪一致性问题解决...

在学习Zipkin分布式追踪系统中我们了解到Trace在整个调用链是一致的&#xff0c;在web服务中可以通过在header设置Trace值在不同的服务中进行传递&#xff0c;那样在一个服务内部不同的线程&#xff0c;甚至是线程池中Zipkin是如何处理的&#xff0c;接下来我们来了解学习一下。…

SQL server 数据库面试题及答案(实操2)

使用你的名字创建一个数据库 创建表&#xff1a; 数据库中有三张表&#xff0c;分别为student,course,SC&#xff08;即学生表&#xff0c;课程表&#xff0c;选课表&#xff09; 问题&#xff1a; --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

python电子相册制作软件_电子相册怎么做

电子相册制作 本文来自#千兆网络有什么用#征稿活动&#xff0c;不断提速的网络给你的生活带来了什么变化&#xff1f;快来参与活动&#xff0c;聊聊你玩转互联网&#xff0c;高速网上冲浪的经历&#xff01;>点击这里查看活动详情< 现在手机的拍照功能日趋强大&#xff0…

java list 范围删除_JAVA中循环删除list中元素(移除list两时间范围外的元素)

印象中循环删除list中的元素使用for循环的方式是有问题的&#xff0c;但是可以使用增强的for循环&#xff0c;然后今天在使用时发现报错了&#xff0c;然后去科普了一下&#xff0c;再然后发现这是一个误区。下面就来讲一讲。。伸手党可直接跳至文末。看总结。。JAVA中循环遍历…

python标注审核_Python类型标注

机器学习越来越火&#xff0c;大量的机器学习包都支持Python&#xff0c;导致了Python近几年非常火爆&#xff0c;入手门槛低&#xff0c;编程简单&#xff0c;概念非常少。越来越多的新手小白加入到Python编程。 Python虽然简单&#xff0c;但也带来很多问题。尤其是弱类型一直…

php的在线问卷调查_基于php技术的问卷调查系统

本系统前台主要使用php作为开发语言&#xff0c;后台使用mysql作为数据库管理系统&#xff0c;开发环境是wamp&#xff0c;服务器采用apache。系统的主要功能包括&#xff1a;管理登陆、问卷调查题目及内容选项的添加、修改和查询&#xff0c;调查结果统计等。分为管理员用户、…

python reduce函数_Python reduce()函数的用法小结

reduce()函数也是Python内置的一个高阶函数。 reduce() 格式&#xff1a; reduce (func, seq[, init()]) reduce()函数即为化简函数&#xff0c;它的执行过程为&#xff1a;每一次迭代&#xff0c;都将上一次的迭代结果&#xff08;注&#xff1a;第一次为init元素&#xff0c;…

Php获取id并提交表单,提交表单后 PHP获取提交内容的实现方法

提交表单后 PHP获取提交内容的实现方法2020-06-14 15:35:24问题&#xff1a;网页上提交表单之后&#xff0c;PHP为什么不能获取提交的内容&#xff1f;然而在老版本的PHP上运行却正常。新版的PHP已经废弃了原来的表单内容处理方式&#xff0c;即不再把提交的表单的内容直接复制…