juc面试题
一:线程同步的方式有哪些?
线程同步指的就是让多个线程之间按照顺序访问同一个共享资源
- synchronized:Java中最基本的线程同步机制,可以修饰代码块或方法,保证同一时间只有一个线程访问该代码块或方法,其他线程需要等待锁的释放。
- ReentrantLock:可以保证同一时间只有一个线程访问共享资源,但是更灵活,支持公平锁、可中断锁、多个条件变量等功能。
- Semaphore:允许多个线程同时访问共享资源,但是限制访问的线程数量。可以用于控制并发访问的线程数量,避免系统资源被过度占用。
- CountDownLatch:允许一个或多个线程等待其他线程执行完毕之后再执行,可以用于线程之间的协调和通信。
- CyclicBarrier类:允许多个线程在一个栅栏处等待,直到所有线程都到达栅栏位置之后,才会继续执行。
二:Semaphore、CountDownLatch、CyclicBarrier区别?
它们都可以用来协调多个线程之间的执行。
- Semaphore是一个计数信号量,它允许多个线程同时访问共享资源,并通过计数器来控制访问数量。通常用来实现一个线程需要等待获取一个许可证才能访问共享资源,或者需要释放一个许可证才能完成操作的操作。
- CountDownLatch是一个计数器,通常用来实现一个线程等待其他多个线程完成操作之后再继续执行的操作。
- CyclicBarrier是一个同步屏障,通常用来实现多个线程在同一个屏障处等待,然后再一起继续执行的操作。
三:有三个线程T1,T2,T3如何保证顺序执行?
-
使用join:Thread类中提供了一个join方法,join就是把thread1这个子线程加入到当前主线程中,也就是主线程要阻塞在这里,等子线程执行完之后再继续执行。
-
Semaphore
-
使用CountDownLatch:主要就是想办法让编排三个子线程的主线程阻塞,保证T1执行完再启动T2,T2执行完再启动T3。而这个编排的方式就是想办法知道什么时候子线程执行完,就可以通过CountDownLatch实现。
4. 使用线程池:线程池内部是使用了队列来存储任务的,所以线程的执行顺序会按照任务的提交顺序执行的,但是如果是多个线程同时执行的话,是保证不了先后顺序的,因为可能先提交的后执行了。但是我们可以定义一个只有一个线程的线程池,然后依次的将T1,T2,T3提交给他执行: