设计模式

Java编程思想

[亡魂溺海] 提交于 2021-01-13 15:23:32
前言 Q: 为什么学习并发? A: 到目前为止,你学到的都是有关顺序编程的知识,即程序中的所有事物在任意时刻都只能执行一个步骤。 A: 编程问题中相当大的一部分都可以通过使用顺序编程来解决,然而,对于某些问题,如果能够并行地执行程序的多个部分,则会变得非常方便而且很有必要。 A: 并发编程可以使程序执行速度得到极大的提高,或者为设计某些类型的程序提供更易用的模型,或者两者皆有。 A: 另一个问题你必须意识到,当并发执行的任务彼此开始相互干涉时,实际的并发问题就会接踵而来。实际上你可能无法编写出能够针对你的并发程序生成故障条件的测试代码。所产生的故障经常是偶尔发生,并且经常是以客户抱怨的形式出现,这就是为什么要学习并发的强烈理由:如果视而不见,你就会遭其反噬。 A: 有很多Java程序,要么只是偶尔工作,要么在大多数时间里工作,并且会由于未发现的并发缺陷而时不时地神秘崩溃,有时这种崩溃是温和的,但有时却意味着重要数据的丢失,并且如果没有意识到并发问题,你可能最终会认为问题出在其他什么地方,而不在你的软件中。基本上,了解并发可以使你意识到明显正确的程序可能会展示出不正确的行为。 并发的多面性 Q: 如何理解并发的多面性? A: 并发编程令人困惑的一个最主要原因是:使用并发时需要解决的问题有多个,而实现并发的方式也有多重,并且在这两者之间没有明显的映射关系

Java多线程优化

风流意气都作罢 提交于 2021-01-13 07:26:38
----以下文章来源于51CTO技术栈 ,作者 崔皓 今天,我们从 Java 内部锁优化,代码中的锁优化,以及线程池优化几个方面展开讨论。 Java 内部锁优化 当使用 Java 多线程访问共享资源的时候,会出现竞态的现象。即随着时间的变化,多线程“写”共享资源的最终结果会有所不同。 为了解决这个问题,让多线程“写”资源的时候有先后顺序,引入了锁的概念。每次一个线程只能持有一个锁进行写操作,其他的线程等待该线程释放锁以后才能进行后续操作。 从这个角度来看,锁的使用在 Java 多线程编程中是相当重要的,那么是如何对锁进行优化? 众所周知,Java 的锁分为两种: 一种是内部锁,它用 Synchronized 关键字来修饰,由 JVM 负责管理,并且不会出现锁泄漏的情况。 另外一种是显示锁。 这里重点讨论的是内部锁优化。内部锁的优化方式由 Java 内部机制完成,虽然不需要程序员直接参与,但了解它对理解多线程优化原理有很大帮助。 这部分的优化主要包括四部分: 锁消除 锁粗化 偏向锁 适应锁 锁消除(Lock Elision), JIT 编译器对内部锁的优化。在介绍其原理之前先说说,逃逸和逃逸分析。 逃逸是指在方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其他变量引用。 也就是,在方法体之外引用方法内的对象。在方法执行完毕之后,方法中创建的对象应该被 GC 回收

Linux操作系统的VI命令

亡梦爱人 提交于 2021-01-13 02:03:57
Linux操作系统的VI命令   VI是Linux系统的一个文本编辑器,该编辑器可以通过使用VI命令来操作,从而完成对文本的编辑。熟练掌握一些常用的VI命令,可以大大简化编辑操作并提高操作Linux文本的效率 。   使用VI命令编辑文本时,有三种编辑模式—— 命令模式 (command mode)、 插入模式 (Insert mode)和 底行模式 (last line mode)。 (一)命令模式   命令模式可以在文本中快速定位光标在指定区域、执行复制和粘贴操作、执行删除操作等。   ①光标移动 命令 描 述 命令 描 述 0 光标定位到开头位置 G 光标定位到结束位置 ^ 光标定位行首 $ 光标定位行尾 Ctrl+f 光标定位到上一页 Ctrl+b 光标定位到下一页 Ctrl+d 光标定位到上半页 Ctrl+u 光标定位到下半页 [n]l 光标定位到行的第 n 格 [n]G 光标定位到第 n 行 h 、 j 、 k 、 l 光标向左、下、上、右移一格   ②删除文本 命 令 描 述 命 令 描 述 x 删除光标后一个字符 [n]x 删除光标后 n 个字符 X 删除光标前一个字符 [n]X 删除光标前 n 个字符 dd 删除当前行 [n]dd 向下删除 n 行 dG 向下删除到最后一行 dw 删除当前的单词 d0 删除光标至行首 d$ 删除光标至行尾   ③删除、复制、粘贴

静态代理,jdk动态代理以及Cglib区别

我们两清 提交于 2021-01-12 19:58:01
众所周知,Spring AOP中涉及到了动态代理模式,那么有动态代理相应的就会有静态代理。那么动态代理分为哪几种,相对应的区别又是什么呢? 首先什么是代理? 找一个东西或者一个人去帮你做事,比如常说的中介就是一个代理,各大经销商的代理商等等。JAVA中的代理即是指将自己的事情委派给别人帮忙去完成。 静态代理:代理的是程序员已经创建好的类,也就是说当前仅有一个对象能被成功代理。上代码看下 首先是一个需要代理的接口类 该类描述了两个方法,一个是eat(),一个是run(); public interface UserAction { void eat(); void run(); } 接下来是该类的实现类,较为简单的实现方式,仅仅打印内容而已。 public class UserActionImpl implements UserAction { @Override public void eat() { System.out.println("吃饭"); } @Override public void run() { System.out.println("跑步"); } } 接口已经实现完成,剩下的即是代理对象了。上述的过程中静态代理和JDK的动态代理还没有区别。区别在于下面 public class UserActionStaticProxy implements

在CentOS 7 上安装 wordpress

感情迁移 提交于 2021-01-11 15:08:06
在CentOS 7 上安装 wordpress 软件版本: 操纵系统: CentOS 7 PHP: 7.4 MySQL: 8.0 Wordpress: 5.6 配置CentOS和epel源(可选): sed -i 's#https\?://[^/]*/\(centos\|\$contentdir\)/#http://mirrors.aliyun.com/centos/#g; s/^#baseurl/baseurl/; s/^metalink=/#metalink=/; s/^mirrorlist=/#mirrorlist=/' /etc/yum.repos.d/CentOS-Base.repo sed -i 's#https\?://[^/]*/\(pub/\)\?epel#http://mirrors.aliyun.com/epel#g; s/^#baseurl/baseurl/; s/^metalink=/#metalink=/; s/^mirrorlist=/#mirrorlist=/' /etc/yum.repos.d/epel*.repo yum install -y epel-release sed -i 's#https\?://[^/]*/\(pub/\)\?epel#http://mirrors.aliyun.com/epel#g; s/^#baseurl

JAVA自学笔记20

旧时模样 提交于 2021-01-11 08:36:10
JAVA自学笔记20 1、递归: 1)方法定义中定义中调用方法本身的现象 2)要有出口,否则就是死递归 次数不能太多。否则内存将溢出 构造方法不能递归使用 //斐波那契数列:1,1,2,3,5,8,13,21.34 public int Fibonacci ( int n){ if (n== 1 ||n== 2 ){ return 1 ;} return Fibonacci(n- 1 )+Fibonacci(n- 2 ) } @例题1:遍历目录下指定后缀名结尾的文件名称 private static void getAllJavaFilePaths (File srcFolder){ //获取该目录下所有的文件或者文件夹的File数组 File[] fileArray=srcFolder.listFiles(); for (File file:fileArray){ if (file.isDirectory()){ getAllJavaFilePaths(file) } else { if (file.getNmae().endsWith( ".java" )){ System. out .println(file.getAbsolutePath()); } } } } @例题2:递归删除带内容的目录 public class DeleteFolders{ File[]

【软件构造】课程提纲(3)

生来就可爱ヽ(ⅴ<●) 提交于 2021-01-11 08:13:55
第四章 1. 代码可理解性 / 可读性 (1)度量可理解的指标:名称长度、名称唯一性比率、复杂性、代码行数、注释密度、嵌套层数 (2)可读性:人类读者可以轻松理解源代码的目的,控制流程和操作 (3)代码可读性强的例子: Example A : z = ((3*x^2) + (4*x) - 5) - (( 2*y^2) - (7*y) + 11) / ((3*x^2) + (4*x) - 5) Example B : a = (3*x^2) + (4*x) - 5; b = ( 2*y^2) - (7*y) + 11; z = (a - b) / a B 的代码可读性强于 A 2. 编码规范:名称符合约定和语义、复杂性低、代码行数少、适当添加必要注释、嵌套层数少 第五章 1. 面向 / 基于复用编程: ( 1 )为什么复用:成本有效性和及时性、可生成可靠的软件、标准化 ( 2 )面向复用编程( for ):开发可重用组件 ( 3 )基于复用编程( with ):用可重用组件进行开发 ( 4 )可重用性高的表现:简单、可移植性和兼容性好、灵活、可扩展、通用和参数化、模块化、稳定、将变化限制在局部 2. LSP :子类必须能够替换基类,具有较弱的前置条件和较强的后置条件,尽量从抽象类而非具体类继承 3. 数组的子类型化:代码重用,如 List -> ArrayList 4.

【软件构造】写在前面的话和课程介绍(完结)

落爺英雄遲暮 提交于 2021-01-11 07:54:00
写在前面的话     作为一个非标准理工生,我在学习计算机专业课时总是有很多的不适。 当我试着将自己擅长的软科学与行业相结合,也明确了自己的目标与方向。   本博客只用于发表本人在学习专业课程和 产品相关知识时 (不干产品了,搞技术!)的随笔; 而在这个系列,本人将会尝试用偏文科的学习方式,拆解重构“软件构造”的课程内容,每一章会有本人的学习心得感悟; 随笔中主要内容来自随堂笔记,博客会随着课程的推进逐步更新。   第一次尝试经营博客, 还请各位前辈指教。 课程介绍 课程名称:软件构造 开课时间:2018春 主教材: Code Complete 参考课程: MIT6.031 CMU15.214 博客链接: 【软件构造】第一章第一节 软件构造的多维视角 【软件构造】第一章第二节 软件开发的质量属性 【软件构造】第二章第一节 软件生命周期和版本控制(配置管理) 【软件构造】第二章第二节 软件构造的过程、系统和工具 【软件构造】第三章第一节 数据类型与类型检查 【软件构造】第三章第二节 设计规约 【软件构造】第三章第三节 抽象数据型(ADT) 【软件构造】第三章第四节 面向对象编程OOP 【软件构造】第三章第五节 ADT和OOP中的等价性 【软件构造】第四章第一节 面向可理解性的构造 【软件构造】第五章第一节 可复用性的度量、形态和外部观察 【软件构造】第五章第二节 设计可复用的软件

[文章汇总]ASP.NET Core框架揭秘[最近更新:2018/10/31]

倾然丶 夕夏残阳落幕 提交于 2021-01-11 05:55:46
之前一段时间都在个人公众号账号“大内老A”发布关于ASP.NET Core的系列文章,很多人留言希望能够同步到这里,所以在这里 对这些文章做一个汇总,以便于PC端阅读。如果说微软官方文档主要关于ASP.NET Core的编程模式的话,我这个系列则主要关注整个ASP.NET Core的设计思想和实现原理。我希望这个系列为致力于深入学习ASP.NET Core的人提供一个全面、系统而深入的知识库。为了确保本系列的纯粹性,这个系列旨在关注ASP.NET Core以中间件管道核心的框架,不会涉及建立在它之上的编程模型(比如ASP.NET Core MVC)。 第一部分 入门体验 1. 多平台开发体验 多平台开发体验[1]: Windows 多平台开发体验[2]: Mac OS X 多平台开发体验[3]: Linux 多平台开发体验[4]: Docker 2. 跨平台的奥秘 跨平台的奥秘[1]: 历史的枷锁[上篇] 跨平台的奥秘[2]: 历史的枷锁[下篇] 跨平台的奥秘[3]: 复用之殇[上篇] 跨平台的奥秘[4]: 复用之殇[中篇] 跨平台的奥秘[5]: 复用之殇[下篇] 跨平台的奥秘[6]: 全新的布局[上篇] 跨平台的奥秘[7]: 全新的布局[下篇] 第二部分 基础框架 3. 依赖注入 依赖注入[1]: 控制反转 依赖注入[2]: 基于IoC的设计模式 依赖注入[3]: 依赖注入模式

win10 安装 mysql8.0

最后都变了- 提交于 2021-01-10 16:51:33
MySQL8.0 Windows zip包下载地址: https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-winx64.zip Windows 10 一、安装 1. 解压zip包到安装目录 比如我的安装目录是:D:\Program\MySQL 2.配置文件 在Windows系统中,配置文件默认是安装目录下的 my.ini 文件,部分配置需要在初始安装时配置,大部分也可以在安装完成后进行更改。当然,极端情况下,所有的都是可以更改的。 在安装根目录下添加 my.ini,比如我这里是:D:\MySQL\my.ini,写入基本配置: [mysqld] # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log