1.服务器CPU数量及线程池线程数量的关系?
首先确认业务是CPU密集型还是lO密集型的,
如果是CPU密集型的,那么就应该尽量少的线程数量,一般为CPU的核数+1;
如果是IO密集型:所以可多分配一点 cpu核数*2也可以使用公式:CPU核数Ⅰ(1-阻塞系数);其中阻塞系数在0.8~0.9之间。
CPU密集型:加密,解密,压缩各种算法
lO密集型:文件 *** 作
2.多线程之间是如何通信的?
多进程之间通讯:信号量、信号、套接字、有名管道、无名管道、共享内存、mq
由于多线程之间共享了进程的地址空间,所以,原生就支持数据共享,当一个线程修改了进程的变量,由于共享空间,另外一个线程自然能看到,所以原生支持通讯。
由于线程之间并发必然会引起互斥 *** 作,这时就需要同步机制:volatile、sync、ReentrantLock、ReadWriteReentrantLock
1、通过共享变量,变量需要volatile修饰
2、使用wait()和notifyAll()方法,但是由于需要使用同一把锁,所以必须通知线程释放锁,被通知线程才能获取到锁,这样导致通知不及时。
3、使用CountDownLatch实现,通知线程到指定条件,调用countDownLatch.countDown(),被通知线程进行countDownLatch.await()。
4、使用Condition的await()和signalAll()方法。
3.描述一下synchronized底层实现,以及和lock的区别?
~~~~
4..synchronized关键字加在静态方法和实例方法的区别?
修饰静态方法,是对类进行加锁,如果该类中有methodA和methodB都是被synchronized修饰的静态方法,此时有两个线程T1、T2分别调用methodA()和methodB(),则T2会阻塞等待直到T1执行完成之后才能执行。
修饰实例方法时,是对实例进行加锁,锁的是实例对象的对象头,如果调用同一个对象的两个不同的被synchronized修饰的实例方法时,看到的效果和上面的一样,如果调用不同对象的两个不同的被
synchronized修饰的实例方法时,则不会阻塞。
synchronized关键字:作用目标是谁?必须是 对象
所以推论-→>它必须依赖于一个对象存在。
普通实例方法:依赖的对象是谁? this,当前类的对象
加在静态方法:this存在吗?所以推理他肯定不是当前对象。XXx.class this.getClass ->由于synchronized必须依赖于对象,所以静态方法的依赖对象就是class
->>>>>
5.静态变量存储在JVM的哪里? jdk1.8
在Class对象的尾部->在JVM的堆内存中
6.countdownlatch的用法?
。。。。
两种用法:
1、让主线程await,业务线程进行业务处理,处理完成时调用countdownLatch.countDown(),CountDownLatch实例化的时候需要根据业务去选择CountDownLatch的count;
2、让业务线程await,主线程处理完数据之后进行countdownLatch.countDown(),此时业务线程被唤醒,然后去主线程拿数据,或者执行自己的业务逻辑。
7.线程池问题:
~~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)