java并发编程的艺术-学习笔记(1)
程序员文章站
2022-05-04 10:09:28
...
第一章-并发编程的挑战
-
上下文切换
CPU通过时间片算法来循环执行任务,当前任务执行一个时间片会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便于下次切换回这个任务时,可以再次加载这个任务的状态。从任务的保存到在加载就是一次上下文切换
CPU是通过给每个线程分配cpu时间片来实现多线程的,时间片特别短,一般为几十毫秒,cpu通过不同的切换线程,让我们感觉到多线程是同时工作的。 -
如何减少上下文切换
无所并发编程:多线程竞争锁,会引起上下文切换, 所以要避免使用锁
CAS算法:Java中的Atomic包使用CAS来更新数据,不需要加锁
使用最少线程:避免创建不需要的线程
协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的调度(?)
public class DeadLockDemo {
private static String A = "A";
private static String B = "BA";
public static void main(String[] args) {
DeadLockDemo.dedaLock();
}
public static void dedaLock() {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (A) {
try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (B) {
System.out.println("1");
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (B){
synchronized (A){
System.out.println("2");
}
}
}
});
t1.start();
t2.start();
}
}
上面代码演示了死锁的场景,AB互相等待对方释放锁。通过dump可以看到
以上信息告诉我们在33和22行代码发生了死锁。
3.避免死锁的方法
避免一个线程同时获取多个锁
避免一个线程在锁内同时占有多个资源,尽量保证每个锁只占有一个资源
尝试使用定时锁,使用Lock.tryLock来替代使用内部锁机制
上一篇: 并发编程的艺术之读书笔记(九)
下一篇: PHP接收上传文件_PHP教程