基础:java基础,集合,多线程,反射,对象复制,javaweb,异常模块,网络模块。
架构:spring(springmvcspringboot春云),hibernate,mybatis,rabbitmqkafkazookeeper,设计模式。
数据库:mysql,redis
虚拟机(javavirtualmachin
volatil
这个题目太宽泛了,可以就这个题目写一本书,比如《java并发编程实践》,甚至一本书都不够。限于篇幅,我从线程的抽象任务和线程的实际形式两个角度来讲。
任务抽象线程是对cpu资源的抽象,可以映射成一个可执行的任务。从操作系统的多通道编程到多线程设计,其实就是多任务模型的开发,不断简化建模和设计的难度,充分利用cpu资源。
任务需要操作资源,主要包括内存数据和来自各种io设备的数据。
不同的任务需要协作:任务执行顺序的控制、资源访问的同步、任务间的通信等。
线程通信线程主要可以看作是运行时的一个指令执行序列和相关内存信息(内核态和用户态,包括栈、tls、内核对象和运行时设计的相关对象)。
如果两个线程位于同一个进程中,就相当于进程间的ipc。
我一般从信息交换和操作同步两个方面来看线程通信。
第一,信息交换,本质上是两个线程可以通过一个公共区域交换消息。这个公共区域对应的原始资源包括寄存器、内存、各种io设备等。
用java开发时,进程中的两个线程可以通过使用可公开访问的对象直接交换信息。不同的进程,如ipc机制,共享内存、文件系统、流水线、网络协议实现组件等。,都有最基本的类库实现。
第二,操作同步
同步的关键是锁,锁的核心是原子性,死锁是最重要的问题。
java中可用的锁包括以下几种:
首先是cas接口,在包下。这一点非常重要。你要实现非阻塞锁,要应用自如。无锁模式也是处理高并发最理想的。这个函数本质上是cpu提供的一种基本类型的原子操作。下面显示器的无锁模式也是由cas实现的。
其次,虚拟机封装的监控机制使用对象锁来实现互斥和协作。当你用synchronized修饰实例方法、静态方法和代码块,或者调用对象的wait、notify和notifyall时,你是在使用虚拟机提供的objectmonitor的功能,立足点是操作系统提供的信号量。只要系统调用使用内核对象,锁就会变得更重。如果关注性能,可以尝试深入了解它在无锁状态、偏锁、轻量级锁、重量级锁之间的升降级。
最后是大量的模式设计(比如生产者和消费者队列)和通用数据结构的同步,主要提供编程的便利。我们可以关注abstractqueuedsynchronizer类的实现。核心点是最终传递的synchronized标记在objectmonitor中结束。semaphore和reentrantlock也是基于它实现的,官方api文档也给出了一个基于abstractqueuedsynchronizer实现新的例子。