Java并发Map的面试指南:线程安全数据结构的奥秘

2023-09-19
阅读 8 分钟
591
在计算机软件开发的世界里,多线程编程是一个重要且令人兴奋的领域。然而,与其引人入胜的潜力相伴而来的是复杂性和挑战,其中之一就是处理共享数据。当多个线程同时访问和修改共享数据时,很容易出现各种问题,如竞态条件和数据不一致性。

杰哥教你面试之一百问系列:java中高级多线程concurrent的使用

2023-09-07
阅读 60 分钟
578
提到多线程,当然要熟悉java提供的各种多线程相关的并发包了,而java.util.concurrent就是最最经常会使用到的,那么关于concurrent的面试题目有哪些呢?一起来看看吧。

杰哥教你面试之一百问系列:java多线程

2023-09-01
阅读 30 分钟
402
java多线程是java面试中的高频问题,如何才能在面试中脱颖而出呢?熟读这里的一百个java多线程面试问题即可。1. 什么是线程?什么是进程?回答:线程是操作系统能够进行调度的最小执行单位,它包含在进程中,共享进程的资源。进程是一个正在执行中的程序,它包含了代码、数据和系统资源。一个进程可以包含多个线程。2. ...

在nodejs中创建cluster

2021-01-31
阅读 5 分钟
1.2k
在前面的文章中,我们讲到了可以通过worker_threads来创建新的线程,可以使用child_process来创建新的子进程。本文将会介绍如何创建nodejs的集群cluster。

在nodejs中创建child process

2021-01-25
阅读 7 分钟
2.6k
nodejs的main event loop是单线程的,nodejs本身也维护着Worker Pool用来处理一些耗时的操作,我们还可以通过使用nodejs提供的worker_threads来手动创建新的线程来执行自己的任务。

nodejs中使用worker_threads来创建新的线程

2021-01-21
阅读 12 分钟
3.2k
之前的文章中提到了,nodejs中有两种线程,一种是event loop用来相应用户的请求和处理各种callback。另一种就是worker pool用来处理各种耗时操作。

Reactor中的Thread和Scheduler

2020-11-11
阅读 4 分钟
1.4k
简介今天我们要介绍的是Reactor中的多线程模型和定时器模型,Reactor之前我们已经介绍过了,它实际上是观察者模式的延伸。所以从本质上来说,Reactor是和多线程无关的。你可以把它用在多线程或者不用在多线程。今天将会给大家介绍一下如何在Reactor中使用多线程和定时器模型。Thread多线程先看一下之前举的Flux的创建的例...

java安全编码指南之:Thread API调用规则

2020-10-19
阅读 5 分钟
1k
简介java中多线程的开发中少不了使用Thread,我们在使用Thread中提供的API过程中,应该注意些什么规则呢?一起来看一看吧。start一个ThreadThread中有两个方法,一个是start方法,一个是run方法,两个都可以调用,那么两个有什么区别呢?先看一下start方法: {代码...} start()是一个synchronized的方法,通过它会去调用...

并发和Read-copy update(RCU)

2020-06-04
阅读 4 分钟
1.4k
RCU(Read-copy update)是一种同步机制,并在2002年被加入了Linux内核中。它的优点就是可以在更新的过程中,运行多个reader进行读操作。

ABA问题的本质及其解决办法

2020-06-01
阅读 3 分钟
7.1k
CAS的全称是compare and swap,它是java同步类的基础,java.util.concurrent中的同步类基本上都是使用CAS来实现其原子性的。

java 8 lambda表达式中的异常处理

2020-04-23
阅读 4 分钟
1.9k
java 8中引入了lambda表达式,lambda表达式可以让我们的代码更加简介,业务逻辑更加清晰,但是在lambda表达式中使用的Functional Interface并没有很好的处理异常,因为JDK提供的这些Functional Interface通常都是没有抛出异常的,这意味着需要我们自己手动来处理异常。

java 8 Stream中操作类型和peek的使用

2020-04-23
阅读 2 分钟
1.5k
java 8 Stream中操作类型和peek的使用 简介 java 8 stream作为流式操作有两种操作类型,中间操作和终止操作。这两种有什么区别呢? 我们看一个peek的例子: {代码...} 上面的例子中,我们的本意是打印出Stream的值,但实际上没有任何输出。 为什么呢? 中间操作和终止操作 一个java 8的stream是由三部分组成的。数据源,...

java并发Exchanger的使用

2020-04-23
阅读 3 分钟
4.3k
Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。

java中functional interface的分类和使用

2020-04-20
阅读 5 分钟
1.6k
executorService.submit需要接收一个Runnable类,上面的例子中我们new了一个Runnable类,并实现了它的run()方法。

非阻塞算法(Lock-Free)的实现

2020-04-15
阅读 3 分钟
1.3k
非阻塞算法(Lock-Free)的实现 上篇文章我们讲到了使用锁会带来的各种缺点,本文将会讲解如何使用非阻塞算法。非阻塞算法一般会使用CAS来协调线程的操作。 虽然非阻塞算法有诸多优点,但是在实现上要比基于锁的算法更加繁琐和负责。 本文将会介绍两个是用非阻塞算法实现的数据结构。 非阻塞的栈 我们先使用CAS来构建几...

非阻塞同步机制和CAS

2020-04-15
阅读 2 分钟
2.4k
我们知道在java 5之前同步是通过Synchronized关键字来实现的,在java 5之后,java.util.concurrent包里面添加了很多性能更加强大的同步类。这些强大的类中很多都实现了非阻塞的同步机制从而帮助其提升性能。

同步类的基础AbstractQueuedSynchronizer(AQS)

2020-04-14
阅读 3 分钟
1k
我们之前介绍了很多同步类,比如ReentrantLock,Semaphore, CountDownLatch, ReentrantReadWriteLock,FutureTask等。

由于不当的执行顺序导致的死锁

2020-04-11
阅读 3 分钟
994
为了保证线程的安全,我们引入了加锁机制,但是如果不加限制的使用加锁,就有可能会导致顺序死锁(Lock-Ordering Deadlock)。上篇文章我们也提到了在线程词中因为资源的不足而导致的资源死锁(Resource Deadlock)。

java中有界队列的饱和策略(reject policy)

2020-04-10
阅读 5 分钟
4.1k
我们在使用ExecutorService的时候知道,在ExecutorService中有个一个Queue来保存提交的任务,通过不同的构造函数,我们可以创建无界的队列(ExecutorService.newCachedThreadPool)和有界的队列(ExecutorService newFixedThreadPool(int nThreads))。

我们的线程被饿死了

2020-04-09
阅读 1 分钟
1.6k
那么线程池使用不当可不可能产生死锁呢?我们知道死锁是循环争夺资源而产生的。线程池中的线程也是资源的一种,那么如果对线程池中的线程进行争夺的话也是可能产生死锁的。

使用ExecutorService来停止线程服务

2020-04-08
阅读 4 分钟
969
这两种关闭的区别在于各自的安全性和响应性。shutdownNow强行关闭速度更快,但是风险也更大,因为任务可能正在执行的过程中被结束了。而shutdown正常关闭虽然速度比较慢,但是却更安全,因为它一直等到队列中的所有任务都执行完毕之后才关闭。

java中CompletionService的使用

2020-04-03
阅读 3 分钟
1k
之前的文章中我们讲到了ExecutorService,通过ExecutorService我们可以提交一个个的task,并且返回Future,然后通过调用Future.get方法来返回任务的执行结果。

java多线程之Phaser

2020-03-31
阅读 3 分钟
1.3k
前面的文章中我们讲到了CyclicBarrier、CountDownLatch的使用,这里再回顾一下CountDownLatch主要用在一个线程等待多个线程执行完毕的情况,而CyclicBarrier用在多个线程互相等待执行完毕的情况。

关于CompletableFuture的一切,看这篇文章就够了

2020-03-30
阅读 5 分钟
3.2k
java中CompletableFuture的使用 之前的文章中,我们讲解了Future, 本文我们将会继续讲解java 8中引入的CompletableFuture的用法。 CompletableFuture首先是一个Future,它拥有Future所有的功能,包括获取异步执行结果,取消正在执行的任务等。 除此之外,CompletableFuture还是一个CompletionStage。 我们看下Completab...

java中ThreadLocalRandom的使用

2020-03-27
阅读 3 分钟
2.1k
在java中我们通常会需要使用到java.util.Random来便利的生产随机数。但是Random是线程安全的,如果要在线程环境中的话就有可能产生性能瓶颈。

在java中使用JMH(Java Microbenchmark Harness)做性能测试

2020-03-26
阅读 4 分钟
1.8k
JMH的全称是Java Microbenchmark Harness,是一个open JDK中用来做性能测试的套件。该套件已经被包含在了JDK 12中。

java中CyclicBarrier的使用

2020-03-25
阅读 7 分钟
1.4k
CyclicBarrier是java 5中引入的线程安全的组件。它有一个barrier的概念,主要用来等待所有的线程都执行完毕,然后再去执行特定的操作。

java并发中CountDownLatch的使用

2020-03-24
阅读 5 分钟
1.7k
在java并发中,控制共享变量的访问非常重要,有时候我们也想控制并发线程的执行顺序,比如:等待所有线程都执行完毕之后再执行另外的线程,或者等所有线程都准备好了才开始所有线程的执行等。

java中Locks的使用

2020-03-23
阅读 6 分钟
1.5k
之前文章中我们讲到,java中实现同步的方式是使用synchronized block。在java 5中,Locks被引入了,来提供更加灵活的同步控制。

java中ThreadPool的介绍和使用

2020-03-19
阅读 6 分钟
1.3k
在Java中,threads是和系统的threads相对应的,用来处理一系列的系统资源。不管在windows和linux下面,能开启的线程个数都是有限的,如果你在java程序中无限制的创建thread,那么将会遇到无线程可创建的情况。