编译型语言解释型语言?动态类型语言,静态类型语言?动态语言静态语言?强类型语言弱类型语言?Java是什么样的计算机语言?
什么是变量?机制
Java平台无关性?jvm
Java四大特性?抽象 继承 封装 多态 重点是多态
C语言数组和java数组的区别?
内存图解释 一位数组 二维数组 对象数组 结合代码?
Java里面的引用机制?C语言里面的指针? c++里面的引用? 这里面可以谈谈基本类型
引用数据类型 类通过引用机制实现C语言中的函数指针?
类 相当于C语言里面的(数据类型)?
类的初始化?会写代码举例?类加载机制?
构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象?
java的不可变类?final修饰什么?String是不可变类么?equals 和 ==?重写equals和hashcode?
什么时候需要重写equals 和hashcode?规则是什么?
单例类?饿汉式 懒汉式 (掌握)
登记式(用的比较少)
this引用的理解?
集合体系 set map区别 Linked hashSet TreeSet区别 定制排序 自然排序是实现? 性能分析 底层实现 内存占用
那些事线程安全的集合类?collections工具类了解吗? 底层算法实现hash算法实现 treeSet实现 实现arrayList LinkedList等等
泛型 内部类 lambda表达式 ?
多线程?同步方式?java异常分析?
IO NIO netty ?//
C语言编程
遍历算法? 红黑树等树的算法?查找算法?
字符串操作?
网络编程 反射 ?
java虚拟机 gcc 内存管理 垃圾回收机制?
垃圾回收 内存管理 程序的内存图解析? java虚拟机部分章节的阅读?
htpp tcpip 计算机网络? tcpip协议的部分章节阅读?
大数据云计算等最新概念理解?
Java集合框架是什么?说出一些集合框架的优点?
集合框架中的泛型有什么优点?
Java集合框架的基础接口有哪些?
Iterator是什么?
为何没有像Iterator.add()这样的方法,向集合中添加元素?
Iterater和ListIterator之间有什么区别?
遍历一个List有哪些不同的方式?
通过迭代器fail-fast属性,你明白了什么?
在迭代一个集合的时候,如何避免ConcurrentModificationException?
在Java中,HashMap是如何工作的?
hashCode()和equals()方法有何重要性?
我们能否使用任何类作为Map的key?
Map接口提供了哪些不同的集合视图?
HashMap和HashTable有何不同?
如何决定选用HashMap还是TreeMap?
ArrayList和Vector有何异同点?
Array和ArrayList有何区别?什么时候更适合用Array?
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小的,而ArrayList大小是固定的。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。
尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。
(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。
(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,
在指定大小的基本类型的列表上工作也会变得很慢。
(3)如果你要使用多维数组,使用[][]比List<List<>>更容易
ArrayList和LinkedList有何区别?
哪些集合类提供对元素的随机访问?
EnumSet是什么?
java.util.EnumSet是使用枚举类型的集合实现。枚举类型更加规范
当集合创建时,枚举集合中的所有元素必须来自单个指定的枚举类型,可以是显示的或隐示的。
哪些集合类是线程安全的?
BlockingQueue是什么?
Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素的时候,它会等待队列变为非空;
当在添加一个元素时,它会等待队列中的可用空间。
BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。
队列和栈是什么,列出它们的区别?
Comparable和Comparator接口是什么?
Comparable和Comparator接口有何区别?
我们如何对一组对象进行排序?
我们如何从给定集合那里创建一个synchronized的集合?、、、、、、、、
list与Set、Map区别及适用场景
ArrayList与LinkedList的区别和适用场景
ArrayList与Vector的区别和适用场景
HashSet与Treeset的适用场景
HashMap与TreeMap、HashTable的区别及适用场景
什么是线程?
线程和进程有什么区别?
如何在Java中实现线程?
用Runnable还是Thread?
Thread 类中的start() 和 run() 方法有什么区别?
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。
当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。
Java中Runnable和Callable有什么不同?
Java中的volatile 变量是什么?
什么是线程安全?Vector是一个线程安全类吗?
Java中什么是竞态条件? 举个例子说明
竞态条件会导致程序在并发情况下出现一些bugs。
多线程对一些资源的竞争的时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,
那么整个程序就会出现一些不确定的bugs。
Java中如何停止一个线程?
一个线程运行时发生异常会怎样?
简单的说,如果异常没有被捕获该线程将会停止执行。
Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。
当一个未捕获异常将造成线程中断的时候JVM会使用Thread.getUncaughtExceptionHandler()
来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。
如何在两个线程间共享数据?
你可以通过共享对象来实现这个目的,或者是使用像阻塞队列这样并发的数据结构。生产消费者模型
ConcurrentHashMap
Java中notify 和 notifyAll有什么区别?
notify()方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地。
而notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行
为什么wait, notify 和 notifyAll这些方法不在thread类里面?
一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。
如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。
如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。
简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。
什么是ThreadLocal变量?
保存线程的独立变量 ThreadLocal为每个使用该变量的线程提供独立的变量副本,
所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。常用于用户登录控制,如记录session信息。
什么是FutureTask?
在Java并发程序中FutureTask表示一个可以取消的异步运算。
它有启动和取消运算、查询运算是否完成和取回运算结果等方法。
只有当运算完成的时候结果才能取回,如果运算尚未完成get方法将会阻塞。
一个FutureTask对象可以对实现了Callable和Runnable的对象进行包装。然后FutureTask对象可以作为Thread对象的参数
Java中interrupted 和 isInterruptedd方法的区别?
主要区别是前者会将中断状态清除而后者不会
为什么wait和notify方法要在同步块中调用?
主要是因为Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。
还有一个原因是为了避免wait和notify之间产生竞态条件。
Java中的同步集合与并发集合有什么区别?
同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高
Java中堆和栈有什么不同?
什么是线程池? 为什么要使用它?
如何写代码来解决生产者消费者问题?
比较低级的办法是用wait和notify来解决这个问题
比较赞的办法是用BlockingQueue来实现生产者消费者模型
如何避免死锁?
避免死锁最简单的方法就是阻止循环等待条件,
将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁
Java中活锁和死锁有什么区别?
怎么检测一个线程是否拥有锁?
在java.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁
JVM中哪个参数是用来控制线程的栈堆栈小的?
-Xss参数用来控制线程的堆栈大小。
Java中synchronized 和 ReentrantLock 有什么不同?
lock更灵活,可以自由定义多把锁的加锁解锁顺序(synchronized要按照先加的后解顺序)
提供多种加锁方案,lock 阻塞式, trylock 无阻塞式, lockInterruptily 可打断式, 还有trylock的 带 超时时间版本。
本质上和监视器锁(即synchronized是一样的)
能力越大,责任越大,必须控制好加锁和解锁,否则会导致灾难。
可以和Condition类的结合。
性能更高
有三个线程T1,T2,T3,怎么确保它们按顺序执行?
你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。
为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。
Thread类中的yield方法有什么作用?
Java中Semaphore是什么?
Java中的Semaphore是一种新的同步类,它是一个计数信号。
从概念上讲,从概念上讲,信号量维护了一个许可集合。
如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。
每个 release()添加一个许可,从而可能释放一个正在阻塞的获取者。
但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应的行动。
信号量常常用于多线程的代码中,比如数据库连接池。
如果你提交任务时,线程池队列已满。会时发会生什么?
事实上如果一个任务不能被调度执行那么ThreadPoolExecutor’s submit()方法
将会抛出一个RejectedExecutionException异常
Java线程池中submit() 和 execute()方法有什么区别?
两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中,
而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中,它扩展了Executor接口
如何在Java中创建Immutable对象?(不可变类)
通过构造方法初始化所有成员、对变量不要提供setter方法、
将所有的成员声明为私有的,这样就不允许直接访问这些成员、
在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝
Java中的ReadWriteLock是什么?
首先明确一下,不是说ReentrantLock不好,只是ReentrantLock某些时候有局限。
如果使用ReentrantLock,可能本身是为了防止线程A在写数据、线程B在读数据造成的数据不一致,
但这样,如果线程C在读数据、线程D也在读数据,读数据是不会改变数据的,没有必要加锁,但是还是加锁了,降低了程序的性能。
因为这个,才诞生了读写锁ReadWriteLock。ReadWriteLock是一个读写锁接口,
ReentrantReadWriteLock是ReadWriteLock接口的一个具体实现,实现了读写的分离,
读锁是共享的,写锁是独占的 ,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。
多线程中的忙循环是什么?
忙循环就是程序员用循环让一个线程等待,不像传统方法wait(), sleep() 或 yield() 它们都放弃了CPU控制,
而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存
volatile 变量和 atomic 变量有什么不同?
首先,volatile 变量和 atomic 变量看起来很像,但功能却不一样。
Volatile变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不能保证原子性。
例如用volatile修饰count变量那么 count++ 操作就不是原子性的。
而AtomicInteger类提供的atomic方法可以让这种操作具有原子性如getAndIncrement()方法会原子性的进行增量操作
把当前值加一,其它数据类型和引用变量也可以进行相似操作
如果同步块内的线程抛出异常会发生什么?
无论你的同步块是正常还是异常退出的,里面的线程都会释放锁
而注意 lock的话需要在finally手动释放锁
单例模式的双检锁是什么?线程安全的单例模式?
//双重检查锁定 第一次同步 以后存在了就不需要同步
public static Singleton getInstance() {
if (single == null) {
synchronized (Singleton.class) {
if (single == null) {
single = new Singleton();
}
}
}
return single;
}
//饿汉式单例类.在类初始化时,已经自行实例化 不需要使用synchronized
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
如何在Java中创建线程安全的Singleton?
懒汉式 双重检查 或者直接在方法上加同步
写出3条你遵循的多线程最佳实践?
给你的线程起个有意义的名字。可以方便找bug或追踪
避免锁定 和 缩小同步的范围
多用同步类少用wait 和 notify
多用并发集合少用同步集合
如何强制启动一个线程?
Java多线程中调用wait() 和 sleep()方法有什么不同?
Java中如何获取到线程dump文件?
死循环、死锁、阻塞、页面打开慢等问题,打线程dump是最好的解决问题的途径。
所谓线程dump也就是线程堆栈,获取到线程堆栈有两步:
(1)获取到线程的pid,可以通过使用jps命令,在Linux环境下还可以使用ps -ef | grep java
(2)打印线程堆栈,可以通过使用jstack pid命令,在linux环境下还可以使用kill -3 pid
死锁举例?
什么是AQS?
线程类的构造方法、静态块是被哪个线程调用的
请记住:线程类的构造方法、静态块是被new这个线程类所在的线程所调用的,而run方法里面的代码才是被线程自身所调用的。
如果说上面的说法让你感到困惑,那么我举个例子, 假设Thread2中new了Thread1,main函数中new了Thread2,那么:
(1)Thread2的构造方法、静态块是main线程调用的,Thread2的run()方法是Thread2自己调用的
(2)Thread1的构造方法、静态块是Thread2调用的,Thread1的run()方法是Thread1自己调用的
mysql优化 你知道吗?
jvm的优化 gc 内存模型 内存分配 运行时数据区?
什么是变量?机制
Java平台无关性?jvm
Java四大特性?抽象 继承 封装 多态 重点是多态
C语言数组和java数组的区别?
内存图解释 一位数组 二维数组 对象数组 结合代码?
Java里面的引用机制?C语言里面的指针? c++里面的引用? 这里面可以谈谈基本类型
引用数据类型 类通过引用机制实现C语言中的函数指针?
类 相当于C语言里面的(数据类型)?
类的初始化?会写代码举例?类加载机制?
构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象?
java的不可变类?final修饰什么?String是不可变类么?equals 和 ==?重写equals和hashcode?
什么时候需要重写equals 和hashcode?规则是什么?
单例类?饿汉式 懒汉式 (掌握)
登记式(用的比较少)
this引用的理解?
集合体系 set map区别 Linked hashSet TreeSet区别 定制排序 自然排序是实现? 性能分析 底层实现 内存占用
那些事线程安全的集合类?collections工具类了解吗? 底层算法实现hash算法实现 treeSet实现 实现arrayList LinkedList等等
泛型 内部类 lambda表达式 ?
多线程?同步方式?java异常分析?
IO NIO netty ?//
C语言编程
遍历算法? 红黑树等树的算法?查找算法?
字符串操作?
网络编程 反射 ?
java虚拟机 gcc 内存管理 垃圾回收机制?
垃圾回收 内存管理 程序的内存图解析? java虚拟机部分章节的阅读?
htpp tcpip 计算机网络? tcpip协议的部分章节阅读?
大数据云计算等最新概念理解?
Java集合框架是什么?说出一些集合框架的优点?
集合框架中的泛型有什么优点?
Java集合框架的基础接口有哪些?
Iterator是什么?
为何没有像Iterator.add()这样的方法,向集合中添加元素?
Iterater和ListIterator之间有什么区别?
遍历一个List有哪些不同的方式?
通过迭代器fail-fast属性,你明白了什么?
在迭代一个集合的时候,如何避免ConcurrentModificationException?
在Java中,HashMap是如何工作的?
hashCode()和equals()方法有何重要性?
我们能否使用任何类作为Map的key?
Map接口提供了哪些不同的集合视图?
HashMap和HashTable有何不同?
如何决定选用HashMap还是TreeMap?
ArrayList和Vector有何异同点?
Array和ArrayList有何区别?什么时候更适合用Array?
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小的,而ArrayList大小是固定的。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。
尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。
(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。
(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,
在指定大小的基本类型的列表上工作也会变得很慢。
(3)如果你要使用多维数组,使用[][]比List<List<>>更容易
ArrayList和LinkedList有何区别?
哪些集合类提供对元素的随机访问?
EnumSet是什么?
java.util.EnumSet是使用枚举类型的集合实现。枚举类型更加规范
当集合创建时,枚举集合中的所有元素必须来自单个指定的枚举类型,可以是显示的或隐示的。
哪些集合类是线程安全的?
BlockingQueue是什么?
Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素的时候,它会等待队列变为非空;
当在添加一个元素时,它会等待队列中的可用空间。
BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。
队列和栈是什么,列出它们的区别?
Comparable和Comparator接口是什么?
Comparable和Comparator接口有何区别?
我们如何对一组对象进行排序?
我们如何从给定集合那里创建一个synchronized的集合?、、、、、、、、
list与Set、Map区别及适用场景
ArrayList与LinkedList的区别和适用场景
ArrayList与Vector的区别和适用场景
HashSet与Treeset的适用场景
HashMap与TreeMap、HashTable的区别及适用场景
什么是线程?
线程和进程有什么区别?
如何在Java中实现线程?
用Runnable还是Thread?
Thread 类中的start() 和 run() 方法有什么区别?
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。
当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。
Java中Runnable和Callable有什么不同?
Java中的volatile 变量是什么?
什么是线程安全?Vector是一个线程安全类吗?
Java中什么是竞态条件? 举个例子说明
竞态条件会导致程序在并发情况下出现一些bugs。
多线程对一些资源的竞争的时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,
那么整个程序就会出现一些不确定的bugs。
Java中如何停止一个线程?
一个线程运行时发生异常会怎样?
简单的说,如果异常没有被捕获该线程将会停止执行。
Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。
当一个未捕获异常将造成线程中断的时候JVM会使用Thread.getUncaughtExceptionHandler()
来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。
如何在两个线程间共享数据?
你可以通过共享对象来实现这个目的,或者是使用像阻塞队列这样并发的数据结构。生产消费者模型
ConcurrentHashMap
Java中notify 和 notifyAll有什么区别?
notify()方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地。
而notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行
为什么wait, notify 和 notifyAll这些方法不在thread类里面?
一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。
如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。
如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。
简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。
什么是ThreadLocal变量?
保存线程的独立变量 ThreadLocal为每个使用该变量的线程提供独立的变量副本,
所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。常用于用户登录控制,如记录session信息。
什么是FutureTask?
在Java并发程序中FutureTask表示一个可以取消的异步运算。
它有启动和取消运算、查询运算是否完成和取回运算结果等方法。
只有当运算完成的时候结果才能取回,如果运算尚未完成get方法将会阻塞。
一个FutureTask对象可以对实现了Callable和Runnable的对象进行包装。然后FutureTask对象可以作为Thread对象的参数
Java中interrupted 和 isInterruptedd方法的区别?
主要区别是前者会将中断状态清除而后者不会
为什么wait和notify方法要在同步块中调用?
主要是因为Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。
还有一个原因是为了避免wait和notify之间产生竞态条件。
Java中的同步集合与并发集合有什么区别?
同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高
Java中堆和栈有什么不同?
什么是线程池? 为什么要使用它?
如何写代码来解决生产者消费者问题?
比较低级的办法是用wait和notify来解决这个问题
比较赞的办法是用BlockingQueue来实现生产者消费者模型
如何避免死锁?
避免死锁最简单的方法就是阻止循环等待条件,
将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁
Java中活锁和死锁有什么区别?
怎么检测一个线程是否拥有锁?
在java.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁
JVM中哪个参数是用来控制线程的栈堆栈小的?
-Xss参数用来控制线程的堆栈大小。
Java中synchronized 和 ReentrantLock 有什么不同?
lock更灵活,可以自由定义多把锁的加锁解锁顺序(synchronized要按照先加的后解顺序)
提供多种加锁方案,lock 阻塞式, trylock 无阻塞式, lockInterruptily 可打断式, 还有trylock的 带 超时时间版本。
本质上和监视器锁(即synchronized是一样的)
能力越大,责任越大,必须控制好加锁和解锁,否则会导致灾难。
可以和Condition类的结合。
性能更高
有三个线程T1,T2,T3,怎么确保它们按顺序执行?
你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。
为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。
Thread类中的yield方法有什么作用?
Java中Semaphore是什么?
Java中的Semaphore是一种新的同步类,它是一个计数信号。
从概念上讲,从概念上讲,信号量维护了一个许可集合。
如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。
每个 release()添加一个许可,从而可能释放一个正在阻塞的获取者。
但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应的行动。
信号量常常用于多线程的代码中,比如数据库连接池。
如果你提交任务时,线程池队列已满。会时发会生什么?
事实上如果一个任务不能被调度执行那么ThreadPoolExecutor’s submit()方法
将会抛出一个RejectedExecutionException异常
Java线程池中submit() 和 execute()方法有什么区别?
两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中,
而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中,它扩展了Executor接口
如何在Java中创建Immutable对象?(不可变类)
通过构造方法初始化所有成员、对变量不要提供setter方法、
将所有的成员声明为私有的,这样就不允许直接访问这些成员、
在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝
Java中的ReadWriteLock是什么?
首先明确一下,不是说ReentrantLock不好,只是ReentrantLock某些时候有局限。
如果使用ReentrantLock,可能本身是为了防止线程A在写数据、线程B在读数据造成的数据不一致,
但这样,如果线程C在读数据、线程D也在读数据,读数据是不会改变数据的,没有必要加锁,但是还是加锁了,降低了程序的性能。
因为这个,才诞生了读写锁ReadWriteLock。ReadWriteLock是一个读写锁接口,
ReentrantReadWriteLock是ReadWriteLock接口的一个具体实现,实现了读写的分离,
读锁是共享的,写锁是独占的 ,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。
多线程中的忙循环是什么?
忙循环就是程序员用循环让一个线程等待,不像传统方法wait(), sleep() 或 yield() 它们都放弃了CPU控制,
而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存
volatile 变量和 atomic 变量有什么不同?
首先,volatile 变量和 atomic 变量看起来很像,但功能却不一样。
Volatile变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不能保证原子性。
例如用volatile修饰count变量那么 count++ 操作就不是原子性的。
而AtomicInteger类提供的atomic方法可以让这种操作具有原子性如getAndIncrement()方法会原子性的进行增量操作
把当前值加一,其它数据类型和引用变量也可以进行相似操作
如果同步块内的线程抛出异常会发生什么?
无论你的同步块是正常还是异常退出的,里面的线程都会释放锁
而注意 lock的话需要在finally手动释放锁
单例模式的双检锁是什么?线程安全的单例模式?
//双重检查锁定 第一次同步 以后存在了就不需要同步
public static Singleton getInstance() {
if (single == null) {
synchronized (Singleton.class) {
if (single == null) {
single = new Singleton();
}
}
}
return single;
}
//饿汉式单例类.在类初始化时,已经自行实例化 不需要使用synchronized
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
如何在Java中创建线程安全的Singleton?
懒汉式 双重检查 或者直接在方法上加同步
写出3条你遵循的多线程最佳实践?
给你的线程起个有意义的名字。可以方便找bug或追踪
避免锁定 和 缩小同步的范围
多用同步类少用wait 和 notify
多用并发集合少用同步集合
如何强制启动一个线程?
Java多线程中调用wait() 和 sleep()方法有什么不同?
Java中如何获取到线程dump文件?
死循环、死锁、阻塞、页面打开慢等问题,打线程dump是最好的解决问题的途径。
所谓线程dump也就是线程堆栈,获取到线程堆栈有两步:
(1)获取到线程的pid,可以通过使用jps命令,在Linux环境下还可以使用ps -ef | grep java
(2)打印线程堆栈,可以通过使用jstack pid命令,在linux环境下还可以使用kill -3 pid
死锁举例?
什么是AQS?
线程类的构造方法、静态块是被哪个线程调用的
请记住:线程类的构造方法、静态块是被new这个线程类所在的线程所调用的,而run方法里面的代码才是被线程自身所调用的。
如果说上面的说法让你感到困惑,那么我举个例子, 假设Thread2中new了Thread1,main函数中new了Thread2,那么:
(1)Thread2的构造方法、静态块是main线程调用的,Thread2的run()方法是Thread2自己调用的
(2)Thread1的构造方法、静态块是Thread2调用的,Thread1的run()方法是Thread1自己调用的
mysql优化 你知道吗?
jvm的优化 gc 内存模型 内存分配 运行时数据区?