51、Java 中的同步集合与并发集合有什么区别?
同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合, 不过并发集合的可 扩展性更高。在 Java1.5 之前程序员们只有同步集合来用且在多线程并发的时候会导致争 用, 阻碍了系统的扩展性。Java5 介绍了并发集合像 ConcurrentHashMap,不仅提供线程安全还用锁分离和内部分区等现代技术提高 了可扩展 性。
52、什么是线程池? 为什么要使用它?
创建线程要花费昂贵的资源和时间, 如果任务来了才创建线程那么响应时间会变 长, 而且一个进程能创建的线程数有限。为了避免这些问题, 在程序启动的时候就 创建若干线程来响应处理, 它们被称为线程池, 里面的线程叫工作线程。从 JDK1.5 开始, Java API 提供了 Executor 框架让你可以创建不同的线程池。
53、怎么检测一个线程是否拥有锁?
在 java.lang.Thread 中有一个方法叫 holdsLock(), 它返回 true 如果当且仅当当前线程 拥有某个具体对象的锁。
54、你如何在 Java 中获取线程堆栈?
kill -3 [java pid] 不会在当前终端输出, 它会输出到代码执行的或指定的地方去。比如, kill -3 tomcat pid, 输出堆栈到 log 目录下。 Jstack [java pid] 这个比较简单, 在当前终端显示, 也可以重定向到指定文件中。 -JvisualVM: Thread Dump 不做说明, 打开 JvisualVM 后, 都是界面操作, 过程还是很简单的。55、 JVM 中哪个参数是用来控制线程的栈堆栈小的? -Xss 每个线程的栈大小
56、Thread 类中的yield 方法有什么作用?
使当前线程从执行状态( 运行状态) 变为可执行态( 就绪状态)。 当前线程到了就绪状态, 那么接下来哪个线程会从就绪状态变成执行状态呢? 可能是当 前线程, 也可能是其他线程, 看系统的分配了。
57、Java 中 ConcurrentHashMap 的并发度是什么?
ConcurrentHashMap 把实际 map 划分成若干部分来实现它的可扩展性和线程安全。这 种划分是使用并发度获得的, 它是 ConcurrentHashMap 类构造函数的一个可选参数, 默认值为 16, 这样在多线程情况下就能避免争用。 在 JDK8 后, 它摒弃了 Segment( 锁段) 的概念, 而是启用了一种全新的方式实现,利 用 CAS 算法。同时加入了更多的辅助变量来提高并发度,具体内容还是查看源码吧。
58、Java 中 Semaphore 是什么?
Java 中的 Semaphore 是一种新的同步类, 它是一个计数信号。从概念上讲, 从概念上 讲, 信号量维护了一个许可集合。如有必要, 在许可可用前会阻塞每一个acquire(),然 后再获取该许可。每个 release()添加一个许可,从而可能释放一个正在阻塞的获取者。但 是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数, 并采取相应的 行动。信号量常常用于多线程的代码中, 比如数据库连接池。
59、Java 线程池中submit() 和 execute()方法有什么区别?
两个方法都可以向线程池提交任务,execute()方法的返回类型是 void,它定义在 Executor 接口中。 而 submit()方法可以返回持有计算结果的 Future 对象, 它定义在 ExecutorService 接口中, 它扩展了 Executor 接口, 其它线程池类像 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 都有这些方法
60、什么是阻塞式方法?
阻塞式方法是指程序会一直等待该方法完成期间不做其他事情, ServerSocket 的accept() 方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前 线程会被挂起, 直到得到结果之后才会返回。此外, 还有异步和非阻塞式方法在任务完成前就返回。