1.1上下文切换
1.并发执行一定比串行执行快吗?
不一定。
在多核情况下,可能一个线程负责运行一个,在这种情况下,并发可能更快一些。
但是在单核的情况下,需要多次切换线程,所以串行执行可能会更快一些。
2.多线程开多少个合适?
刚好让CPU打满,根据比例可以算出上限,多线程可以让CPU减少浪费。
3.使用什么工具可以测量上下文切换?
Lmbench3测量上下文切换的时长
vmstat测量上下文切换的次数
4.如何减少上下文切换?
无锁并发编程,CAS算法,使用最少线程和使用协程。
无锁并发编程。多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
5.dump是什么?
把这一瞬间的信息导出成文件
1.2死锁
1.加锁是什么?
加锁的意思是不允许两个线程同时对同一资源进行加锁,但是允许访问。
加锁实例:
public class Test{
public static string x;
public int y;
public static String z;
public static void main(String[] args){
//T0D0 Auto-generated method stub
synchronized(x) { //对引用类型进行加锁,不可以对基本类型加锁
}
}
public synchronized void m1() { //在方法上加锁
}
public void m2(){
synchronized(z){
}
}
}
2.锁的释放?
在块执行完毕后会释放,锁方法会在方法执行完毕后释放。
3.什么是死锁?
死锁是两个或两个以上的进程的每一个都在等待其中一个进程释放资源而被封锁,他们都无法向前推进,这种状态叫死锁。
4.死锁的四个必要条件?
资源互斥使用,保持和等待,非剥夺性,循环等待。
5.如何避免死锁?
避免一个线程同时获取多个锁
避免一个线程在锁内同时占用多个资源,尽量保证每个锁之战用一个资源。
尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
以上是个人的学习笔记,如果涉及内容错误希望得到您的指出,谢谢。