1.3 并发编程的挑战

在并发编程时,如果希望通过多线程执行任务让程序运行的更快,会面临非常多的挑战。 1、上下文切换 CPU通过时间片分配算法来循环执行任务,CPU时间片一般几十毫秒(ms)。在切换至下一个任务前会保存上一个任务的状态。从保存A任务到加载B任务的过程就是一次上下文切换。 linux系统可以使用vmsta...

2019-05-17 19:50:59

阅读数 40

评论数 0

1.2 JAVA线程状态

线程共包括以下5种状态。 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该...

2019-05-17 19:48:16

阅读数 45

评论数 0

1.1 Java语言中的线程安全

讨论线程安全,需要线程之间存在共享数据访问这个前提。 操作共享的 数据 可以分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容、线程对立。 不可变 不可变的对象一定是线程安全的。对象的方法实现或方法的调用者都不用再采取任何额外的措施。 基本数据类型,只要加上final关键字就可以保证不可变...

2019-05-17 19:43:07

阅读数 92

评论数 0

1、并发基础

并行与并发 并发(Concurrency)是说进程B的开始时间是在进程A的开始时间与结束时间之间,我们就说A和B是并发的。 并行(Parallel Execution)是并发的真子集,指同一时间两个进程运行在不同的机器上或者同一个机器不同的核心上。 1、线程安全: 当多个线程访问一个对象时,如果不...

2019-05-17 19:36:35

阅读数 39

评论数 0

4、注释

避免注释 注释并不“纯然地好”,实际上,注释最多也就是一种必须的恶。注释的恰当用法是弥补我们在用代码表达意图时的失败。如果你发现自己需要写注释,再想想看是否有办法翻盘,用代码来表达。 为什么 不准确的注释要比没注释坏得多。 注释存在的时间越久,就离其所描述的代码越远,越来越变得全然错误。原因很简单...

2019-01-15 14:10:31

阅读数 36

评论数 0

2 有意义的命名

名副其实: 如果名称需要注释来补充,那就不算名副其实。注释不是善,而是某种情况下的必须的恶,要尽量避免。 一旦发现有更好的名称就替换掉旧的。 避免误导: 如I与O 做有意义的区分 不做a1 a2这种命名 以读者能鉴别不同之处的命名来区分名称 编码 不要带有编码 命名要足够清楚,精确是命名的要点。...

2019-01-15 14:09:26

阅读数 34

评论数 0

代码整洁之道笔记: 1、整洁代码

好代码 我们将了解到好代码与差代码的差异,以及如何写出好代码、如何将糟糕的代码改成好代码。 只知道怎么骑自行车并不代表会骑自行车,还是会从自行车上摔下来,除了掌握原则和模式,还要自己多实践。 模仿是学习、创新的第一步,阅读大量代码,观察他人如何为错误决策付出代价,琢磨某段代码好在什么地方、坏在什么...

2019-01-15 14:07:50

阅读数 97

评论数 0

Java 代码性能优化(待完善)

1、使用final修饰符修饰 类、方法 为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。 如果指定了一个类为final,则该类所有的方法都是final的。 Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,...

2018-12-19 10:48:03

阅读数 19

评论数 0

Java 数组

一、什么是数组 线性表(linear list):0个或有限多个相同类型的数据元素的序列。 线性表有两种物理结构: 顺序存储结构: 用一段地址连续的存储单元依次存储线性表的数据元素,相邻两元素的存储位置也是挨着的。 链式存储结构: 用一组任意的存储单元存储线性表的数据元素,这组存储...

2018-11-27 11:46:19

阅读数 19

评论数 0

Java代码风格

1、换行 1.1、一个项目可以选择一行80个字符或100个字符的限制,除了下述例外 不可能满足列限制的行(例如,Javadoc中的一个长URL,或是一个长的JSNI方法参考)。 package和import语句。 注释中那些可能被剪切并粘贴到shell中的命令行。 1.2、换行的...

2018-11-19 17:32:54

阅读数 79

评论数 0

IaaS,PaaS,SaaS 的区别

如下图所示,蓝色部分为自己承担的工作量。 IaaS 是云服务的最底层,主要提供一些基础资源(storage、Networking等)。 它与 PaaS 的区别是,用户需要自己控制底层,实现基础设施的使用逻辑。 阿里云ECS、 Amazon EC2 PaaS 提供软件部署平台(...

2018-11-15 10:37:05

阅读数 29

评论数 0

排序算法02: 插入排序

插入排序是这样一种排序: 为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。 与选择排序一样,当前索引左边的元素是有序的,但它们的最终位置还不确定。 插入排序所需的时间取决于输入中元素的初始顺序,在实际应用中对某些类型的非随即数组很有效。 插入排序的比较次数范围为 N-...

2018-11-11 20:07:41

阅读数 26

评论数 0

排序算法01: 选择排序

选择排序是这样的, 首先,找到数组中最小的那个元素,将它与第一个元素交换。 其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序 选择排序有如下两个特点: 运行时间和输入无关,扫描一遍数组并不能为下一遍扫描提供什么信息。 数据移动是最少的,选择排序...

2018-11-11 19:30:20

阅读数 30

评论数 0

mime.types 与 nginx配置

** 一、什么是MIME-TYPE ** MIME——Multipurpose Internet Mail Extension(多用途因特网邮件扩展)最初是为了满足电子邮件支持多字符集及附件而出现的。 通过MIME,我们可以写一封既含有英文,又含有中文,再加上一个文件作为附件的邮件。这种含有多种类...

2018-11-09 14:28:21

阅读数 1509

评论数 0

Java 8 函数式接口 : Supplier、Function、Consumer、Predicate

函数式接口特点 1、三种方法 唯一的抽象方法 使用default定义普通方法(默认方法),通过对象调用。 使用static定义静态方法,通过接口名调用。 2、一个新注解@FunctionInterface 如果某一个接口就是为了函数式接口而生的,使用注解@FunctionalI...

2018-11-02 16:39:03

阅读数 59

评论数 0

Java 8 函数式编程 Lambda

Lambda表达式 a function (or a subroutine) defined, and possibly called, without being bound to an identifier。 一段带有输入参数的可执行语句块。 在Java 8之前,如果想将行为传入函数,仅...

2018-11-01 14:54:51

阅读数 35

评论数 0

Java 8 函数式编程 如何优雅的使用Optional

Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使我们代码中很多繁琐、丑陋的设计变得十分优雅。这篇文章是建立在你对Optional的用法有一定了解的基础上的,如果你还不太了解Optional,可以先去看看相关教程,或者查阅Java文档。 使用Opt...

2018-10-31 10:55:32

阅读数 51

评论数 0

架构笔记02:高性能

1、技术发展与复杂度 技术发展带来了性能上的提升,不一定带来复杂度的提升. 只有那些并不是用来取代旧技术,而是开辟了一个全新领域的技术,才会给软件系统带来复杂度,因为软件系统在设计的时候就需要在这些技术之间进行选择或组合。 2、 软件系统中高性能带来的复杂度主要体现在两方面 单台计算机...

2018-10-29 13:48:50

阅读数 27

评论数 0

程序、进程和线程

程序、进程和线程 指令按照既定的逻辑控制计算机运行,程序是一组指令及参数的集合。 进程则是运行着的程序。 线程是进程中共享进程资源的一个执行单位。 程序和进程的区别: 程序作为一个静态文件存储在计算机系统的硬盘等存储空间中。 进程则是处于动态条件下由操作系统维护的资源管理实体。可以从以下几个方面进...

2018-10-29 10:37:17

阅读数 25

评论数 0

架构读书笔记01:什么是架构设计

1、架构设计的特点 1、架构设计的关键思维是取舍与判断,程序设计的思维是实现与逻辑。 2、架构设计需要适应业务与环境,没有固定的体系与标准 2、架构设计的目的 架构设计的主要目的是为了在自身环境的约束下满足业务需求,解决软件系统的复杂度所带来的问题。 另外,架构师也需要关注项目架构是否会...

2018-10-25 15:06:11

阅读数 53

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭