CyclicBarrier和CountDownLatch区别

两个类都在java.util.concurrent包下,都可以用来表示代码运行在某个点上,二者的区别在于:

1)CyclicBarrier的某个线程运行在某个点上之后,该线程即停止运行,直到所有的线程都达到了这个点,所有线程才重新运行;

CountDownLatch则不是,某县城运行在某个点上之后,只是给某个数值-1而已,该线程继续运行。

2)CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务

3)CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可以再用了

 

2.Java中如何获取到线程的dump文件?

答:所谓dump文件也就是线程堆栈,获取线程堆栈有两步:

1)获取线程的PID,可以通过使用jps命令,在Linux环境下还可以使用ps -ef|grep java

2)打印线程堆栈,可以通过jstack pid命令,在Linux环境下还可以使用kill -3 pid

注意:Thread类提供了一个getStackTrace()方法也可以用于获取线程堆栈。这是一个实例方法,因此此方法是和具体线程实例绑定的,每次获取到的是具体某个线程当前运行的堆栈。

2.1 Linux环境下如何查找哪个线程使用的CPU最长?

答:1)获取线程的PID,可以通过使用jps命令,在Linux环境下还可以使用ps -ef|grep java

2)top -H -p pid,顺序不能变

 

3.ThreadLocal有什么用?

答:ThreadLocal并不是为了解决资源共享的问题,而是用来提供线程内部的局部变量,每个线程都自己管理自己的局部变量,别的线程操作的数据不会对我产生影响,互不影响。这样做是以空间换时间的方式,以耗费内存为代价,大大减少了线程同步所带来的性能消耗以及减少了线程并发控制的复杂度。

4.怎么检测一个线程是否持有对象监视器?

答:Thread类提供了一个holdsLock(Object obj)方法,当且仅当对象obj的监视器被某条线程持有的时候才返回true,注意这是一个static方法,这意味着“某条线程”指的是当前线程。

5. synchronized和ReentrantLock的区别

synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:

(1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁

(2)ReentrantLock可以获取各种锁的信息

(3)ReentrantLock可以灵活地实现多路通知

另外,二者的锁机制其实也是不一样的。ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word.

 

6.ReadWriteLock是什么?

答:ReadWriteLock是一个读写锁接口,ReentrantReadWriteLock是一个ReadWriteLock接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会发生互斥,提升了读写的性能。

 

7.Semaphore有什么作用

Semaphore就是一个信号量,它的作用是限制某段代码块的并发数。Semaphore有一个构造函数,可以传入一个int型整数n,表示某段代码最多只有n个线程可以访问,如果超出了n,那么请等待,等到某个线程执行完毕这段代码块,下一个线程再进入。由此可以看出如果Semaphore构造函数中传入的int型整数n=1,相当于变成了一个synchronized了。

 

8. 高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?

(1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换

(2)并发不高、任务执行时间长的业务要区分开看:

a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以加大线程池中的线程数目,让CPU处理更多的业务

b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换

(3)并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,设置参考(2)。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件对任务进行拆分和解耦。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值