设计模式

把GOF(俗称四人帮)当作圣经

隐身守侯 提交于 2021-01-17 08:54:24
把GOF(俗称四人帮)当作圣经 Andy.Song IT哈哈 我十分羡慕设计模式的几位作者。这本书籍以其他书籍所无可比拟的气势影响了整个IT界。如果你没看过《设计模式》,没有记住模式的名字或者准则的话,那么在面试中就可能无法通过。期望这样的错误可以慢慢改善。 不要误解我,这本书本身是没有问题的。问题出在人们如何解释以及使用它。下面是通常场景: 1.架构师马克,拿到这本书开始阅读。他觉得这本书牛逼坏了! 2.马克趁热打铁开始阅读现在工作的代码。 3.马克选择了一种设计模式并应用到了代码当中。 4.随后马克把这本书推荐给了那些跟他重复同样步骤的资深开发者。 结果就是一团糟。 如何正确使用这本书实际上已经在导读中做了清晰的说明(提醒那些不看导读的人)——“在过去你有个问题,而且这个问题总是一遍又一遍地困扰着你”。注意到其中的顺序了吗?先有一个问题,然后查看这本书之后找到对应的解决方案。 不要掉进看这本书的陷阱当中——“找到一个方案然后尝试把它应用在自己的的代码中。尤其要注意的是,一些书中描述的模式在现实当中已经不再正确。” 来源: oschina 链接: https://my.oschina.net/u/4405012/blog/4906769

Java面试题全集(9)

↘锁芯ラ 提交于 2021-01-17 08:53:45
Java面试题全集(9) 白玉 IT哈哈 80、事务的ACID是指什么? 答: 原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败; 一致性(Consistent):事务结束后系统状态是一致的; 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态; 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。 补充:关于事务,在面试中被问到的概率是很高的,可以问的问题也是很多的。首先需要知道的是,只有存在并发数据访问时才需要事务。当多个事务访问同一数据时,可能会存在5类问题,包括3类数据读取问题(脏读、不可重复读和幻读)和2类数据更新问题(第1类丢失更新和第2类丢失更新)。 脏读(Dirty Read):A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据。 不可重复读(Unrepeatable Read):事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了。 幻读(Phantom Read):事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行。 时间 统计金额事务A 转账事务B 第1类丢失更新:事务A撤销时,把已经提交的事务B的更新数据覆盖了。

Android面试题

女生的网名这么多〃 提交于 2021-01-17 03:45:06
Android面试题[百度,小米,美团] 类加载器 双亲委托机制 自己定义java.lang.String, 在其他地方调用String类,调用的是系统的还是自定义的 同一个类用两个类加载器加载是否一样 类加载器的分类 类加载器在插件化中的应用 Handler Message 一个线程有几个Handler,如果一个线程有多个Handler,那么怎么系统怎么确定某个Message所回调到的handleMessage方法 两个副线程可以使用Looper.prepare公用一个MessageQueue吗?如果可以怎么实现 HandlerThread的用法 多线程 volatile关键词 lReentrantLock synchronized(同步代码快,同步函数,同步变量有什么区别) 有使用过什么多线程类? (回答任意一个都会追究到源码级,例如说AsyncTask,会问AsyncTask的线程池,并行和串行实现以及BlockingQueue的源码) A,B两线程同时启动,A执行到某一段必须等待B执行完才能接着执行,怎么实现?(消费者生产者模式) 设计模式 书写一个线程安全的单例模式(纯手写) 列举几个源码中你觉得用的比较好的设计模式并举例(AlertDialog Builder) 算法(书写代码) 自己实现String的equals方法 字符串反转算法 十二个球

高级开发必须理解的Java中SPI机制

霸气de小男生 提交于 2021-01-17 02:57:50
本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。 1 SPI是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。 整体机制图如下: Java SPI 实际上是“ 基于接口的编程+策略模式+配置文件 ”组合实现的动态加载机制。 系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。 Java SPI就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。所以SPI的核心思想就是 解耦 。 2 使用场景 概括地说,适用于: 调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略 比较常见的例子: 数据库驱动加载接口实现类的加载 JDBC加载不同类型数据库的驱动 日志门面接口实现类加载 SLF4J加载不同提供商的日志实现类 Spring Spring中大量使用了SPI,比如:对servlet3

学习linux的第5天

感情迁移 提交于 2021-01-15 11:03:49
一、Vim编辑器与Shell命令脚本 1.Vim文本编辑器:设置了三种模式:1.命令模式 ;2.输入模式;3.末行模式 打开Vim编辑器时,默认进入命令模式。 从命令模式进入输入模式:按a(下一个字符)键,i(当前字符)键,o(下一行)键中随便一个键进入输入模式 从输入模式进入命令模式:Esc键 从命令模式进入末行模式:按:键 从末行模式进入命令模式:Esc键 Vim中常用的命令: dd 删除光标所在整行 ; 5dd 删除从光标处开始的5行;yy 复制光标所在整行; 5yy 复制从光标处开始的5行; n 显示搜索命令定位到的下一个字符串;N显示搜索命令定位到的上一个字符串;u 撤销上一步的操作;p 将之前删除或复制过的数据粘贴到光标后面。 末行模式中的命令: :w 保存; :q 退出; :q! 强制退出(放弃对文档的修改内容);:wq! 强制保存退出;:set nu 显示行号;:set nonu 不显示行号;:命令 执行该命令;:整数 跳转到该行;:s/one/two 将当前光标所在行的第一个one替换成two;:s/one/two/g 将当前光标所在行的所有one替换成two;:%s/one/two/g 将全文中的所有one替换成two;?字符串 在文本中从下至上搜索该字符串; /字符串 在文本中从上至下搜索该字符串。 2.配置主机名称: vim /etc/hostname

使用设计模式出任CEO迎娶白富美(3)--一番对单例模式的讲解让老板熨帖

ⅰ亾dé卋堺 提交于 2021-01-15 11:03:15
面试阵容 第二天,陈二毛如约来到公司参加面试,但见公司名称:沃特搜古德。啥意思,二毛一脸懵。 前台妹子还是比较漂亮的,白白净净,让二毛顿生好感。 恋恋不舍的坐在前台妹子安排的面试房间,二毛打量了下公司,但见:窗明几净,灯光明亮,嗯不错。 过了一会进来几个人,一个是老猫,坐一边,一个干练的女性,坐一边,另一个颇为威严的中年,坐中间。毫无悬念,老猫是软件部老大需要过来,中间的肯定是老板,旁边的应该是人力资源。 单刀直入 开始是老猫不痛不痒的问了几个基础的计算机常识,例如C语言形参实参啊、Http请求方式啊、做过的项目啊,由于昨天晚上准备了,二毛答的还可以。 然后突然老板就开始问了一句:熟不熟悉设计模式。 果然来了!二毛直接硬气回答:那还是比较熟悉的。 老板又问,单例模式的应用场景说说,二毛那个激动啊,昨天晚上看书有点蒙圈,但是第一个看到的单例模式印象还是很深刻的。 单例模式应用场景 二毛开始回答,以咱们公司来说吧: 单例模式能保证公司只有一个财务部可以出钱。 单例模式能保证公司只有仓储可以存储待发货设备。 单例模式可以保证公司只有一个电源总开关,控制整个公司的设备。 营业执照也是单例,相当于公司在国家的企业信息库注册了一个单例。 法律合规的老婆也是单例,也就是说婚姻法的一个重要目的就是实现配偶的单例,以便实现配偶资源的合理配置。 哈哈…,最后一个案例是二毛的神来之笔

初识VIM

落花浮王杯 提交于 2021-01-15 05:29:40
目 录 第 1 章 文件操作 1 1.1 VIM 基本介绍 1 1.2 VIM 模式介绍 1 1.3 VIM 命令模式 3 1.4 VIM 编辑模式 3 1.5 VIM 末行模式 3 1.6 VIM 视图模式 3 1.7 VIM 环境变量 4 1.8 VIM 扩展知识 4 1.9 VIM 练习 4 第 2 章 目录操作 4 文件操作 Linux系统VIM编辑 VIM基本介绍 vim概述 vi和vim命令是linux中强大的文本编辑器,由于Linux系统一切皆文件,编辑文件是必不可少的工作,而vim有着强大的文本编辑功能。 vi和vim有什么区别? 1、vi不下时语法高亮 2、vim显示语法颜色高亮 3、其他功能没有什么不同 4、所以在Linux系统中,使用vi还是vim取决于个人习惯 安装vim 这里我已经安装过了 键入命令 yum install -y vim 安装vim [root@oldboy ~]# yum install -y vim 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com 软件包 2:vim-enhanced-7.4

深入浅出AQS之共享锁模式

大憨熊 提交于 2021-01-15 02:28:27
搞清楚AQS独占锁的实现原理之后,再看共享锁的实现原理就会轻松很多。两种锁模式之间很多通用的地方本文只会简单说明一下,就不在赘述了 一、执行过程概述 获取锁的过程: 当线程调用acquireShared()申请获取锁资源时,如果成功,则进入临界区。 当获取锁失败时,则创建一个共享类型的节点并进入一个FIFO等待队列,然后被挂起等待唤醒。 当队列中的等待线程被唤醒以后就重新尝试获取锁资源,如果成功则 唤醒后面还在等待的共享节点并把该唤醒事件传递下去,即会依次唤醒在该节点后面的所有共享节点 ,然后进入临界区,否则继续挂起等待。 释放锁过程: 当线程调用releaseShared()进行锁资源释放时,如果释放成功,则唤醒队列中等待的节点,如果有的话。 二、源码深入分析 基于上面所说的共享锁执行流程,我们接下来看下源码实现逻辑: 首先来看下获取锁的方法acquireShared(),如下 public final void acquireShared(int arg) { //尝试获取共享锁,返回值小于0表示获取失败 if (tryAcquireShared(arg) < 0) //执行获取锁失败以后的方法 doAcquireShared(arg); } 这里tryAcquireShared()方法是留给用户去实现具体的获取锁逻辑的。关于该方法的实现有两点需要特别说明: 一

100道Java并发和多线程基础面试题大集合(含解答),这波面试稳了~

删除回忆录丶 提交于 2021-01-14 17:59:19
# 前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了100个多线程的问题。 这些多线程的问题来源于各大网站,可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 整理了一份Java面试宝典完整版PDF # 100个问题汇总 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 (2)防止阻塞

如何学习编程 我的编程学习之路

自古美人都是妖i 提交于 2021-01-14 13:34:19
##学习编程语言的语法 第一次接触到编程的感觉似乎是一种过电的畅爽感。对于编程有种美好的畅想感,似乎是打开了新的世界。但是却并不知道学习些什么。如果此时幸运的话能够找到一本学习编程语言基本语法的书籍,开始第一次的“hello world”之旅。但其中安装开发环境也是一大坑。 而后要是编程书籍选的不好便会陷入迷茫的状态,四处寻找着自己的方向,只学习了编程语法却并不知道如何运用。我在这个阶段耽搁了很久,每天看视频炫技似的开发各种功能,可是看完并没有太多的体会。编程的方法和过程一点也没有学到。 开始自己做一些小项目。说实话这走出舒适区的第一步就举步维艰。本来想自己独立开发一个五子棋小游戏,当时学习的是C语言,但是在开始就卡壳。于是转而开始找了一个教程,照抄了他的代码。做完以后稍微有点感觉了,自己又加了记录步数,悔棋,美化界面等边角料的与主功能不怎么相关的功能。当然这是一个命令行版本的。在最开始的几天兴奋过后,又觉得稍感无聊了。 ##学习编程的具体过程 五子棋游戏只有一个命令行窗口输入坐标,总感觉这样的程序不够酷。此时知乎开始兴起,逛了知乎之后,只感觉思路开阔不少。后来么,被洗脑开始学习python。用过c以后只感觉python是真的好,特别是比C语言的数列好用太多了。C语言开始时候并没有太多的数据结构的知识。只能用数列和结构体什么的对新手真是太不友好了,当时看链表根本搞不懂