当前位置: 首页 > news >正文

网站导航样式推荐一个简单的网站制作

网站导航样式,推荐一个简单的网站制作,网站推广渠道及特点,wordpress迁移数据文章目录 1.1 上下文切换1.1.1 多线程一定快吗1.1.2 如何减少上下文切换 1.2 死锁1.3 资源限制的挑战 1.1 上下文切换 即时是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给多个线程的时间,因为时间…

在这里插入图片描述

文章目录

  • 1.1 上下文切换
    • 1.1.1 多线程一定快吗
    • 1.1.2 如何减少上下文切换
  • 1.2 死锁
  • 1.3 资源限制的挑战

1.1 上下文切换

即时是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给多个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行让我们感觉多个线程是同时执行的,时间片一般是几十毫秒。

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。

1.1.1 多线程一定快吗

下面的代码演示串行和并发执行并累加操作的时间,并发执行一定比串行执行快吗?

public class ConcurrencyTest {private static final int count = 200000000;public static void main(String[] args) throws InterruptedException {concurrency(count);serial(count);}private static void concurrency(int count) throws InterruptedException {long start = System.currentTimeMillis();Thread thread = new Thread(new Runnable() {@Overridepublic void run() {int a = 0;for (int i = 0; i < count; i++) {a +=5;}}});thread.start();int b = 0;for (int i = 0; i < count; i++) {b--;}thread.join();long time = System.currentTimeMillis() - start;System.out.println("count:" + formatToTenThousand(count) +", concurrency: " + time + "ms,b=" + b);}private static void serial(int count) {long start = System.currentTimeMillis();int a = 0;for (int i = 0; i < count; i++) {a +=5;}int b = 0;for (int i = 0; i < count; i++) {b--;}long time = System.currentTimeMillis() - start;System.out.println("count:" + formatToTenThousand(count) +", serial:" + time+"ms, b="+b+", a="+a);System.out.println();}private static String formatToTenThousand(int number) {double tenThousand = (double) number / 10000;DecimalFormat df = new DecimalFormat("0万");return df.format(tenThousand);}}

打印:

count:20000万, concurrency: 15ms,b=-200000000
count:20000万, serial:10ms, b=-200000000, a=1000000000

上述问题的答案是不一定,结果跟机器的核数相关,如果是1核处理器,那么肯定串行快,因为省略了创建线程和多线程上下文切换的时间,如果是多核,那么一般还是并发执行更快。而且这个代码示例中并发也只是两个线程,执行的结果意义不大。
我执行了多次也没有出现书中所描述的随着count数据量增大而出现并发执行更快的趋势,反而是串行一直都更快,即使count大小为两亿。而且这个代码示例基本没有io的处理,代表意义太有限。以我的经验来看,只是涉及在cpu中的计算,而没有与数据库等资源的交互,那么使用多线程意义不大。

1.1.2 如何减少上下文切换

减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。

  • 无锁并发编程。多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁、如将数据的ID取余分段,不同的线程处理不同段的数据。
  • CAS算法。Java的java.util.concurrent.atomic包使用CAS算法来更新数据,而不需要加锁。
  • 使用最少线程。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。
  • 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

java.util.concurrent.atomic包:
在这里插入图片描述

对于Java开发工程师而言,尽量使用JDK并发包提供的并发容器和工具类来解决并发问题,因为这些类都已经通过了充分的测试和优化

1.2 死锁

下面这段代码只是演示死锁的场景,在现实中你可能不会写出这样的代码。但是,在一些更为复杂的场景中,你可能会遇到这样的问题,比如t1拿到锁之后,因为一些异常情况没有释放锁(死循环)。又或者是t1拿到一个数据库锁,释放锁的时候抛出了异常,没释放掉。

public class DeadLockDemo {private static String A = "A";private static String B = "B";public static void main(String[] args) {new DeadLockDemo().deadLock();}private void deadLock() {Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (A) {try {Thread.currentThread().sleep(2000L);} catch (InterruptedException e) {e.printStackTrace();}synchronized (B) {System.out.println("1");}}}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (B) {try {Thread.currentThread().sleep(2000L);} catch (InterruptedException e) {e.printStackTrace();}synchronized (A) {System.out.println("2");}}}});t1.start();t2.start();}
}

避免死锁的几个常见方法:

  • 避免一个线程同时获取多个锁。
  • 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
  • 尝试使用定时锁,使用lock.tryLock(timeout) 来替代使用内部锁机制。
  • 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

1.3 资源限制的挑战

(1)什么是资源限制
资源限制就是程序的执行速度受限于计算机硬件或软件资源。
例如,服务器的带宽只有2Mb/s,每个资源的下载速度是1Mb/s,系统启动10个线程下载资源,下载速度不会变成10Mb/s,所以在进行并发编程时,要考虑这些资源的限制。硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。

(2)资源限制引发的问题
在并发编程中,将代码执行速度加快的原则是将代码中串行执行的部分变成并发执行,但是如果将某段串行的代码并发执行,因为受限于资源,仍然在串行执行,这时候程序不仅不会加快速度,反而会更慢,因为增加了上下文切换和资源调度的时间。例如,之前看到一段程序使用多线程在办公网并发地下载和处理数据时,导致CPU利用率达到100%,几个小时都不能运行完成任务,后来修改为单线程,一个小时就执行完成了。

(3)如何解决资源限制的问题
对于硬件资源限制,可以考虑使用集群并行执行程序。既然单机的资源有限制,那么就让程序在多机上运行。比如使用ODPS、Hadoop或者自己搭建服务器集群,不同的机器处理不同的数据。可以通过“数据ID%机器数”,计算得到一个机器编号,然后由对应编号的机器处理这笔数据。
对于软件资源限制,可以考虑使用资源池将资源复用。比如使用连接池将数据库和socket连接复用,或者在调用对方webservice接口获取数据时,只建立一个连接。

WebService 与 Socket 区别

(4)在资源限制情况下进行并发编程
如何在资源限制的情况下,让程序执行得更快呢?方法就是,根据不同的资源限制调整程序的并发度,比如下载文件程序依赖于两个资源—带宽和硬盘读写速度。有数据库操作时,涉及数据库连接数,如果SQL语句执行非常快,而线程的数量比数据库连接数大很多,则某些线程会被阻塞,等待数据库连接。


读书笔记-Java并发编程的艺术

http://www.yayakq.cn/news/608345/

相关文章:

  • 简单手机网站如何制作教育智慧城市型网站开发
  • 培训机构做网站宣传佛山快速排名
  • 办公门户网站模板网站开发与设计实训总结两千字
  • 做新房坐哪个网站好河南头条最新消息 新闻
  • 自己怎么拍做美食视频网站做计算机版权需要网站源代码
  • 网站建设越秀商城站人工售票时间表
  • 关键词搜索工具好站网dede网站安全设置防挂马教程
  • 网站制作业务wordpress搬家需要修改
  • 模板网站库dw制作网页的基本步骤
  • 高端网站建设公司服务好吗定制官网
  • 网站如何做反链佛山网站域名过期
  • 新公司做网站和域名建立网站的三种方式
  • 网站建设服务哪家前端后端都是网站开发吧
  • 网站做seo要多少钱世界著名建筑设计公司
  • jsp可以做网站吗进入网站后台ftp空间后怎样上传
  • 用代码怎么建设网站数商云网络科技有限公司
  • 手把手教你建网站成都彭州网站建设
  • 网站给他人做付刑事责任php做的卖水果网站有哪些
  • dede网站模版加强政务公开与网站建设
  • 柳河县建设局网站wordpress首页显示文章
  • 网站建设服务商城网站中文域名要到期
  • 哈尔滨服务最好的网站优化公司大连开发区社保网站
  • 制作自己的网站学校网建工作
  • 有专门做宝宝用品的网站吗app资源网站开发
  • .mil 域名网站有哪些制作表格
  • 如何自己开发一个自己的网站网站建设中 意思
  • 门户网站开发语言asp网站出现乱码
  • 北京网站制作很好 乐云践新青岛做公司网站
  • 免费扑克网站网站建设费如何入账怎么摊销
  • 网站效果图可以做动态的嘛智慧云建筑信息平台