栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

《java并发编程的艺术》第一章总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《java并发编程的艺术》第一章总结

并发编程的目的是为了让程序更快地运行,但是,启动更多的线程并不一点让程序最大程度的并行。

上下文切换

单核处理器也能多线程执行代码,处理器是通过时间片的快速切换来实现多线程的,时间片的时间非常短,所以CPU要不停的切换线程执行,时间片一般是十几毫秒。

所以当前任务执行完一个时间片后会切换到下一个任务。但是,在切换前会保存上一个线程的状态,下次切换回该线程时可以再加载这个任务的状态。任务从保存到加载就是一次上下文切换。

根据上下文切换的定义,CPU在切换线程时会保存状态和加载状态,这样的切换同样也是消耗时间的,频繁的上下文切换会影响程序的执行速度,以书中的程序为例:
 

public class ConcurrencyTest {

private static final long count = 10000l;

public static void main(String[] args) throws InterruptedException { concurrency(); serial(); } private static void concurrency() throws InterruptedException {

long start = System.currentTimeMillis();

Thread thread = new Thread(new Runnable() {

@Override public void run() {

int a = 0; for (long i = 0; i < count; i++) { a += 5; }

        }

});

thread.start();

int b = 0;

for (long i = 0; i < count; i++) { b--; }

long time = System.currentTimeMillis() - start; thread.join();

System.out.println("concurrency :" + time+"ms,b="+b);

}

private static void serial() {

long start = System.currentTimeMillis();

int a = 0;

for (long i = 0; i < count; i++) { a += 5; }

int b = 0;

for (long i = 0; i < count; i++) { b--; }

long time = System.currentTimeMillis() - start;

System.out.println("serial:" + time+"ms,b="+b+",a="+a);

}

 当执行操作不超过百万次时,并行执行累加操作会比串行要慢。

通过vmstat测试上下文切换次数

程序每一秒切换1000多次

减少上下文切换可以通过减少线上的WAITING线程

死锁

简单的说有以下几种情况会造成死锁

1、忘记解锁

2、同一个线程中对同一个资源多次加锁

3、有两个线程,两个线程都不释放拥有的锁,也都获取不到等待的锁。

这样就会造成死锁,书上死锁的程序比较简单,这里就不多加描述了。

死锁对于程序来说一定是不可容忍的,我们一定要尽量避免死锁,以下几个方法可以一定程度上避免死锁

1、避免一个线程同时获得多个锁

2、避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源

3、尝试使用定时锁

4、数据库锁的加锁和解锁必须在一个数据库连接里

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/284054.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号