三个线程顺序执行依次输出ABCABCABCABC…
题目描述
三个线程顺序执行依次输出ABCABCABCABC…,让我们如何控制线程的同步访问,使得线程依次输出ABCABCABCABC…的结果。
解题思路
使用最简便最实用的信号量Semaphore,通过控制信号的获取以及释放,承接获取锁来实现线程得顺序执行以及临界资源的同步访问。这里要明白如果信号量(Semaphore)初始化为0的话,调用acquire()就会堵塞,直到调用relase()。
代码实例
1 | package com.czj.interview; |
线程和进程的区别
- 进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。
- 进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。
- 线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。
创建线程有哪几种方式
- 实现Runnable接口
- 通过Callable和Future创建线程
- 继承Thread类
死锁是什么,怎么防止死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
死锁的四个必要条件
- 互斥条件:一个资源每次只能被一个线程使用
- 请求和保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
- 不可剥夺条件:线程已获得的资源,在末使用完之前,不能强行剥夺
- 环路等待条件:若干线程之间形成一种头尾相接的循环等待资源关系
为什么阿里开发手册说线程池不允许使用Executors去创建
- FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
- CachedThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。