hellboy0621的博客

私信 关注
hellboy0621
码龄4年

怕什么真理无穷,进一寸有一寸的欢喜。

  • 113,395
    被访问量
  • 131
    原创文章
  • 50,405
    作者排名
  • 40
    粉丝数量
  • 于 2017-06-16 加入CSDN
获得成就
  • 获得76次点赞
  • 内容获得46次评论
  • 获得189次收藏
荣誉勋章
兴趣领域
  • #后端
    #Redis#Spring Boot#MySQL#Java#Spring
TA的专栏
  • 管理
    1篇
  • 转载
  • Soul网关
    22篇
  • 多线程
    3篇
  • Kafka
    2篇
  • ZooKeeper
    3篇
  • RabbitMQ
    1篇
  • Linux
    27篇
  • Java
    92篇
  • Eclipse
    1篇
  • MongoDB
    8篇
  • JavaScript
    1篇
  • CentOS
    6篇
  • 随笔记
    2篇
  • SVN
    1篇
  • MySQL
    4篇
  • Windows
    2篇
  • Maven
    7篇
  • exe
    1篇
  • Tomcat
    1篇
  • HBase
    4篇
  • HA
    2篇
  • Spark
    5篇
  • 摄影
    1篇
  • Spring
    1篇
  • MyBatis
    1篇
  • JVM
    1篇
  • 大数据
    2篇
  • Hive
    2篇
  • HDFS
    1篇
  • 设计模式
    13篇
  • UML
    1篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

软件公司的两种管理方式 - 转自 CoolShell

本文转自酷壳:https://coolshell.cn/articles/4951.html软件公司的两种管理方式2011年07月06日陈皓评论110 条评论74,539 人阅读这篇文章是我的一个外国的同事Gareth推荐给我的,我和他一起工作过一段时间。他之所以觉得非常不错,是因为这篇文章让他身有体会,他觉得我也一定会有体会,并让我考虑一下翻译到我的blog上来。我看完后觉得很有代表性,而且觉得说得太对了,所以翻译过来,希望大家都读一读,最好转给你的公司老板。这篇文章来源于 ...
转载
30阅读
0评论
0点赞
发布博客于 1 月前

【Soul源码阅读】21.插件之大体流程

插件的接口 SoulPlugin 有很多实现,我们先关注以下这些,从名字上能看出来,这些就是 soul-admin 管理页面上插件列表里的代码实现。下面,以DividePlugin 为例,详细看看这优雅的设计。...
原创
33阅读
0评论
1点赞
发布博客于 2 月前

【Soul源码阅读】20.插件灵魂之选择器和规则

目录1.灵魂2.数据结构3.选择器4.规则1.灵魂这几天一直在看插件相关的功能,一直把核心概念忽略了,那就是所有的插件都有的:selector 和 rule。在看看官网文档https://dromara.org/zh/projects/soul/selector-and-rule/,里面第一句就是:选择器和规则是 soul 网关中最灵魂的东西。掌握好它,你可以对任何流量进行管理。都这么多天过去了,眼睛里净盯着具体对接的协议和同步功能,还有插件的具体使用,就没有关心过.
原创
56阅读
0评论
1点赞
发布博客于 2 月前

【Soul源码阅读】19.插件之 divide

目录1.启动2.开启 divide 插件3.添加选择器和规则4.验证4.1 负载均衡4.2 IP 端口探活官网文档https://dromara.org/zh/projects/soul/divide-plugin/divide插件是网关处理 http协议请求的核心处理插件。1.启动在网关的 pom.xml 文件中添加 starter 依赖,当然,divide 插件是默认支持的。(application-local.yml) <!--if .
原创
30阅读
0评论
1点赞
发布博客于 2 月前

【Soul源码阅读】18.插件之 sentinel

目录1.启动2.开启 sentinel 插件3.添加选择器和规则4.验证官网文档 https://dromara.org/zh/projects/soul/sentinel-plugin/sentinel 插件是网关用来对流量进行限流与熔断的可选选择之一。1.启动在网关的 pom.xml 文件中添加 sentinel的支持。 <!-- soul sentinel plugin start--> <dependency>
原创
12阅读
0评论
1点赞
发布博客于 2 月前

【Soul源码阅读】17.插件之 hystrix

官网文档https://dromara.org/zh/projects/soul/hystrix-plugin/hystrix插件是网关用来对流量进行熔断的核心实现。1.启动在网关的 pom.xml 文件中添加 hystrix starter 依赖 <!-- soul hystrix plugin start--> <dependency> <groupId>org.dromara</g...
原创
45阅读
1评论
1点赞
发布博客于 2 月前

【Soul源码阅读】16.启动多台admin,多个网关,形成一个集群

目录1.启动多台 soul-admin2.启动多台 soul-bootstrap3.启动多台业务系统4.验证同步4.1 负载均衡4.2 数据同步1.启动多台 soul-admin修改配置文件,把可以开启允许并行执行的复选框。application.ymlserver: port: 9095server: port: 9096启动后状态:2.启动多台 soul-bootstrap跟上面的一样,修改配置文件,打开并行执行的开关。.
原创
129阅读
0评论
0点赞
发布博客于 3 月前

【Soul源码阅读】15.soul-admin 与 soul-bootstrap 同步机制之 nacos 解析(下)

目录1.准备2.页面操作3.跟踪源码3.1 soul-admin 端3.2 soul-bootstrap 端上一篇讲到使用 nacos 同步策略,在项目启动时的同步机制,今天来看下在页面操作时,是怎么同步的。1.准备按照昨天的帖子(【Soul源码阅读】14.soul-admin 与 soul-bootstrap 同步机制之 nacos 解析(上)),把项目启动起来,soul-admin、soul-bootstrap 和 soul-examples-http 三个项目,当然还有
原创
860阅读
3评论
1点赞
发布博客于 3 月前

【Soul源码阅读】14.soul-admin 与 soul-bootstrap 同步机制之 nacos 解析(上)

目录1.准备配套设施2.配置2.1 soul-admin 配置2.2 soul-bootstrap 配置3.启动服务4.源码分析1.准备配套设施启动 MySQL、Nacos。使用 docker 启动 Nacos(详情见官网github https://github.com/nacos-group/nacos-docker)。Clone projectgit clone --depth 1 https://github.com/nacos-group/nacos-
原创
83阅读
0评论
1点赞
发布博客于 3 月前

【Soul源码阅读】13.soul-admin 与 soul-bootstrap 同步机制之 http 长轮询解析(下)

目录1.前情回顾2.soul-bootstrap 长轮询任务3.soul-admin 中 /configs/listener 接口3.1比对数据是否有变化3.2阻塞并监听变化1.前情回顾书接上文,昨天的文章【Soul源码阅读】12.soul-admin 与 soul-bootstrap 同步机制之 http 长轮询解析(上) 4.2小节的坑(不开 zk 网关不能启动的错误),没研究明白,最后放弃了,把 soul-admin 和 soul-bootstrap 都关掉,把 soul
原创
70阅读
0评论
1点赞
发布博客于 3 月前

【Soul源码阅读】12.soul-admin 与 soul-bootstrap 同步机制之 http 长轮询解析(上)

1.前情回顾紧接着前两天的 zookeeper,今天来看下 http 长轮询。2.配置数据同步策略官网链接https://dromara.org/zh-cn/docs/soul/user-dataSync.html2.1 soul-admin修改application.yml 配置文件,打开注释的代码:soul: sync: http: enabled: true对应 Bean,默认 enabled 就是 true,只要配置 soul.s...
原创
165阅读
3评论
1点赞
发布博客于 3 月前

【Soul源码阅读】11.soul-admin 与 soul-bootstrap 同步机制之 zookeeper 解析(下)

目录3.3 启动 soul-bootstrap接上篇【Soul源码阅读】10.soul-admin 与 soul-bootstrap 同步机制之 zookeeper 解析(上)3.3 启动 soul-bootstrap在上篇 2.2 小节中,提到了ZookeeperConfig 配置类,在代码中搜索使用的地方,找到ZookeeperSyncDataConfiguration,源码如下:/** * The type Zookeeper configuration. * * @...
原创
97阅读
0评论
1点赞
发布博客于 3 月前

【Soul源码阅读】10.soul-admin 与 soul-bootstrap 同步机制之 zookeeper 解析(上)

1.前情回顾紧接着昨天的 websocket,今天来看下 zookeeper。想知道websocket 相关的出门左转【Soul源码阅读】9.soul-admin 与 soul-bootstrap 同步机制之 websocket 解析2.配置因为数据同步方式是双方规定的,必须保持一致,所以修改配置也是 soul-admin 和 soul-bootstrap 都要改。其实配置都是类似的,之前默认是 websocket,需要把 websocket 相关的配置注释掉,打开zookeeper .
原创
134阅读
0评论
0点赞
发布博客于 3 月前

【Soul源码阅读】9.soul-admin 与 soul-bootstrap 同步机制之 websocket 解析

1.前情回顾在第4篇中,我们分析了 HTTP 用户业务系统接入 Soul 网关后,会调用 soul-admin 的注册接口,把需要网关代理的接口信息全部注册到 soul-admin 上,在最后,会通过 websocket 长连接,将soul-admin 接收到的接口信息同步给 Soul 网关(即 soul-bootstrap),今天就来接着继续分析,数据是怎么同步到 soul-bootstrap 的。不清楚流程的可以出门左转看下第4篇文章【Soul源码阅读】4.HTTP 用户接入 Soul 调用 .
原创
95阅读
0评论
1点赞
发布博客于 3 月前

【Soul源码阅读】番外1.WebFlux服务器启动流程

WebFlux 服务器启动流程结合 Spring Boot 的启动流程讲解 WebFlux 服务启动流程,首先看一下启动时序图:1.run // SpringApplication.java /** * Static helper that can be used to run a {@link SpringApplication} from the * specified sources using default settings and user supplie...
原创
73阅读
4评论
0点赞
发布博客于 3 月前

【Soul源码阅读】8. Spring Cloud 用户接入 Soul 网关流程解析

官网文档中有详细的接入流程,地址:https://dromara.org/zh-cn/docs/soul/user-springcloud.html1.前置条件接入前,请正确的启动soul-admin(如有疑问,出门左转【Soul源码阅读】2.单机部署 Soul或官网文档-搭建Soul网关环境)2.引入网关对 Spring Cloud 的插件支持2.1 公共依赖在 soul-bootstrap 的 pom.xml 文件中,找到了被注释掉的3个依赖,打开注释:<!--so...
原创
48阅读
1评论
1点赞
发布博客于 3 月前

【Soul源码阅读】7. sofa 用户接入 Soul 网关流程解析

官网文档中有详细的接入流程,地址:https://dromara.org/zh-cn/docs/soul/user-sofa.html之前一直没接触过 sofa,官网的介绍如下:SOFARPC is a high-performance, high-extensibility, production-level Java RPC framework. In Ant Financial, SOFARPC has been used for more than ten years and develo
原创
82阅读
0评论
1点赞
发布博客于 3 月前

【Soul源码阅读】6. Dubbo 用户接入 Soul 网关流程解析

OK,前面几天把 HTTP 用户 接入 Soul 网关大概了解了下,尤其是昨天 debug 到底层,发现里面配置了很多 plugin 插件,默认只开启了一个 divide 插件,用来转发 HTTP 请求的。今天不搞那么复杂的,要劳逸结合嘛,毕竟一口吃个胖子只存在于幻想中,还是一口口慢慢消化吧。来一起看下 dubbo 插件吧。根据官网文档操作这年头,各种帖子层出不穷,甚至还有内容农场,相信你也遇到过很多帖子,内容明明一样,各种错误也是直接 copy,对于需要解决问题的我,真的是恨之入骨。即使
原创
87阅读
0评论
1点赞
发布博客于 3 月前

【Soul源码阅读】5.GET 请求在 Soul 网关中流转的简单分析

前几天一直在外围转悠,试用了一下默认的 divide 插件,今天来研究下一个请求是如何通过 Soul 网关分发到真实服务节点的。通过浏览器或 postman 发送一个 GET 请求。http://localhost:9195/http/order/findById?id=95selector 和 rule 默认都打开日志了,可以在 SoulBootstrapApplication 的 console 控制台看到如下日志如下:2021-01-18 18:35:05.357 INFO 20836 -
原创
68阅读
1评论
0点赞
发布博客于 3 月前

【Soul源码阅读】4.HTTP 用户接入 Soul 调用 /soul-client/springmvc-register 接口逻辑分析

今天我们紧接着昨天分析继续,如果想知道昨天分析了点儿啥,出门左转【Soul源码阅读】3.HTTP 用户接入 Soul 流程解析。1. 前情回顾好的,言归正传,昨天分析到我们自己的业务系统,会调用 soul-admin 一个接口,把需要 Soul 网关管理的接口注册,今天就具体看看到底干了点儿啥。先看下调用的接口信息如下:/** * Instantiates a new Soul client bean post processor. * * @param soulSpringMvcC
原创
910阅读
1评论
3点赞
发布博客于 3 月前

【Soul源码阅读】3.HTTP 用户接入 Soul 流程解析

昨天只是极简入门,关于网关是怎么感知到我们的应用的,相信小伙伴们一定有疑问,今天先来看下 HTTP 用户如何接入 Soul,以及接入的流程是怎样的。这是官网对于 HTTP 用户的文档,https://dromara.org/zh-cn/docs/soul/user-http.html。官网文档明确指出,Soul 网关使用 divide 插件来处理http请求,我们在 soul-admin 页面中看到,第一个就是 divide 插件,而且是默认开启的。Http请求接入网关,分2种情况,1种是 sp
原创
226阅读
4评论
1点赞
发布博客于 3 月前

【Soul源码阅读】2.单机部署 Soul

上一篇中,我们对 Soul 有了一个简单的认识。在学习一项新技术时,我们先按照官网上的 Demo 把环境搭建起来。今天先搭建一个单机版测试环境。1.下载源码soul 的 github 地址:https://github.com/dromara/soul这里有2个选择:如果只是用来阅读 soul 源码,不会改动,不提交 PR的,直接 git clone 的地址。 如果学习源码后,希望参与到 soul 开源项目中,fork 到自己账号下,再 clone 自己账号下的 soul 项目。这.
原创
72阅读
0评论
1点赞
发布博客于 3 月前

【Soul源码阅读】1.初识 Soul

无论我们学习什么东西之前,都要先搞清楚我们要学习的是什么,就像一些哲学思考先要给出清晰的定义,否则后面的一切都无从谈起。从今天开始,我来和大家一起,学习一款非常优秀的开源网关项目 Soul。Soul 是什么呢?先来看下官网作者的定义:这是一个异步的,高性能的,跨语言的,响应式的API网关。我希望能够有一样东西像灵魂一样,保护您的微服务。参考了Kong,Spring-Cloud-Gateway等优秀的网关后,站在巨人的肩膀上,Soul由此诞生!里面提到了几个关键字,“异步”、“高性能”、“
原创
941阅读
1评论
1点赞
发布博客于 3 月前

MySQL索引那些事儿

1.B+树一个节点有多个元素 所有元素都在叶子节点冗余 叶子节点间有指针且有序推荐一个B+树演示网站https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html2.InnoDB数据引擎中的页默认页大小为16kbmysql> show global status like 'Innodb_page_size';+------------------+-------+| Variable_name | Val.
原创
76阅读
0评论
0点赞
发布博客于 10 月前

记录Java有意思的代码 持续更新~

1.局部变量对象引用public static void main(String[] args) { List<String> list1 = new ArrayList(); list1.add("a"); list1.add("b"); list1.add("c"); List<String> list2 = new ArrayList(); list2.add("x"); list2.add("y"); li
原创
67阅读
0评论
0点赞
发布博客于 10 月前

线程安全之原子操作 待续~

原子操作,可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中一部分(不可中断性),将整个操作视为一个整体,资源在该次操作中保持一致,这是原子性的核心特征。CAS机制compare and swap,属于硬件同步原语,处理器提供了基本内存操作的原子性保证。CAS操作,需要输入两个数值,一个旧值一个新值,在操作期间先比较下旧值有没有发生变化,如果没有发生变化,才交换成新值;如果发生了变化,则不交换。使用Java中Unsafe类实现CAS机制:impor
原创
63阅读
0评论
1点赞
发布博客于 10 月前

获取线程信息

// 获取 Java 线程管理 MXBeanThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();// 不需要获取同步的 monitor 和 synchronizer 信息,仅获取线程和线程堆栈信息ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);// 遍历线程信息,仅打印线程 ID 和线程名称信息for (ThreadInfo thr.
原创
138阅读
0评论
0点赞
发布博客于 10 月前

线程安全之可见性问题

1、线程安全概念临界区:无法被多个线程同时访问的公共资源。 竞态条件:可能发生在临界区内的特殊条件。 共享资源:被多个线程读取或修改的资源。 线程安全: 如果一段代码是线程安全的,则不包含竞态条件。 只有当多个线程更新共享资源时,才会发生竞态条件。 栈封闭时,不会在线程间共享的变量,都是线程安全的。 局部变量引用本身不共享,但是引用的对象存储在共享堆中。 如果方法内创建的对象,只是在方法中传递,并且不对其他线程可用,也是线程安全的。 判定规则:如果创建、使用和处理资源,永远不
原创
172阅读
0评论
0点赞
发布博客于 11 月前

线程封闭之ThreadLocal

多线程访问共享可变数据时,涉及到线程间数据同步问题。数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中,而避免使同步的技术,称为线程封闭。ThreadLocal线程级别变量 每个线程都有一个ThreadLocal 每个线程都拥有了自己独立的一个变量 竞争条件被彻底消除了 在并发模式下是绝对安全的变量1.示例import java.text.SimpleDateFormat;import java.util.Random;import java.util.c
原创
45阅读
0评论
0点赞
发布博客于 11 月前

MySQL高性能优化规范建议,速度收藏——从JavaGuide大神那里转载

作者: 听风,原文地址:https://www.cnblogs.com/huchong/p/10219318.html。JavaGuide 已获得作者授权。数据库命令规范所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符 临时库表必须以 tmp_为前缀并以日期为后缀,备份表必须以 bak_为前缀并以日期 (时间戳) 为..
转载
82阅读
0评论
0点赞
发布博客于 11 月前

Java线程池那些事儿

阿里巴巴Java手册中,关于线程池:线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。 使用线程池的好处,是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。 如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。线程池的好处:可以重用线程,避免线程创建的开销; 任务过多时,通过排队避免创建过多线程,减少系统资源消耗和竞争,确保任务有序完成。Java JUC包中的实现类是ThreadPoolExecutor,继承Abstra
原创
221阅读
0评论
0点赞
发布博客于 1 年前

Java运行时数据区那些事儿

总是记不住这几个运行时数据区,还是再捋一遍吧。常见分类,一共5个区域,分为2种类型:线程共享 方法区 Method Area 堆内存 Heap 线程独享 虚拟机栈 VM Stack 本地方法栈 Native Method Stack 程序计数器 Program Counter Register 1.方法区存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后...
原创
61阅读
0评论
0点赞
发布博客于 1 年前

github错误 refusing to merge unrelated histories

错误复盘:1、在github上创建一个代码仓;2、在本地使用IDEA创建一个新的项目;3、上传项目git initgit add .git commit -m "initgit remote add origin https://github.com/***.git"git push origin master在最后push时报错:fatal: refusing ...
原创
273阅读
0评论
0点赞
发布博客于 1 年前

Kafka简单操作

下面所有操作都是基于前面2片文章搭建的zookeeper和kafka集群,如果不清楚如何搭建环境,请移步部署3个节点的Zookeeper伪分布式集群和部署3个节点的Kafka伪分布式集群;1、查看现有topiccd /opt/kafka/bin/kafka-topics.sh --zookeeper localhost:2181 --list2、创建一个topic[root@...
原创
106阅读
0评论
0点赞
发布博客于 2 年前

部署3个节点的Kafka伪分布式集群

在部署3个节点的Zookeeper伪分布式集群这篇文章的基础上,部署3个节点的Kafka伪分布式集群Kafka集群不需要像Zookeeper集群似的拷贝多份程序,只需要启动时指定不同的配置文件即可,只需要一份程序1、下载cd /opt/wget https://archive.apache.org/dist/kafka/2.1.0/kafka_2.12-2.1.0.tgz2、解...
原创
165阅读
0评论
0点赞
发布博客于 2 年前

ZooKeeper客户端命令

1、创建节点create [-s] [-e] path data acl-s 顺序节点; -e 临时节点;如果不指定,为持久节点;1.1 创建顺序节点 --断开连接后节点不会消失[zk: localhost:2183(CONNECTED) 4] ls /[zookeeper][zk: localhost:2183(CONNECTED) 5] create -s /zk-tes...
原创
61阅读
0评论
0点赞
发布博客于 2 年前

部署3个节点的Zookeeper伪分布式集群

1、下载cd /optwget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz2、解压tar -zxvf zookeeper-3.4.10.tar.gz3、把解压好的文件夹复制3份,分别为zookeeper1、zookeeper2、zookeeper3,...
原创
78阅读
0评论
0点赞
发布博客于 2 年前

阿里云服务器ssh断联问题解决

无论是通过ssh命令还是ssh客户端连接阿里云服务器,连接后一会儿客户端就被服务器T掉,分析后定位是SSH连接没有设置保活;解决方法有两个设置SSH客户端保活; 设置SSH服务器保活;个人比较喜欢设置SSH服务器保活,具体方法如下:1、修改配置文件vi /etc/ssh/sshd_config找到如下两个配置参数#ClientAliveInterval3 ...
原创
289阅读
0评论
0点赞
发布博客于 2 年前

最新版RabbitMQ安装

一、安装Erlang1、使用yum仓库安装Erlang此方法见官网地址:Using PackageCloud Yum RepositoryA Yum repository with RabbitMQ packages is available from PackageCloud.A quick way to install is to use aPackage Cloud-p...
原创
119阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】13、 建造者模式 Builder

Builder是为创建一个Product对象的各个部件指定的抽象接口。ConcreteBuilder是具体建造者,实现Builder接口,构造和装配各个部件。Product是具体的产品角色;Director是指挥者,构建一个使用Builder接口的对象;建造者模式,主要用于创建一些复杂的对象,这些对象内部构造间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化;建造者...
原创
55阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】12、 外观模式 Facade

外观模式Facade,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。为子系统提供统一入口,封装子系统复杂性,便于客户端调用;外观模式,完美的体现了依赖倒转原则和迪米特法则的思想,是非常常用的模式之一;使用场景:设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,数据访问层、业务逻辑层、表示层,层与层之间建立外观...
原创
67阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】11、 迪米特法则 Law of Demeter

迪米特法则-Law of Demeter,也叫最小知识原则。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。迪米特法则根本思想:强调了类之间的松耦合;类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及;...
原创
68阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】10、 模板方法模式 TemplateMethod

模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。核心:处理步骤在父类中定义好,具体实现延迟到子类中定义;模板方法模式,是通过把不变行为搬移到父类,去除子类中的重复代码来实现它的优势,即提供了一个很好的代码复用平台;当不变和可变的行为在方法中的子类实现中混合在一起的时候,不变的行为就会在子类中重...
原创
43阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】9、原型模式 prototype

原型模式prototype,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节;对于java而言,就是克隆,需要实现Cloneable接口,并覆写clone方法,分为浅克隆和深克隆;clone默认方法,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但不复制引用的...
原创
47阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】8、工厂方法模式 vs 简单工厂模式

简单工厂模式工厂方法模式简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖;如果增加响应的功能,需要在工厂类中增加逻辑分支,修改原有的类,不仅对扩展也对修改开放了,违背了开放-封闭原则。工厂方法模式 - Factory Method,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...
原创
41阅读
0评论
0点赞
发布博客于 2 年前

Maven

1、Maven中scope - 依赖范围:<project> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</vers...
原创
46阅读
0评论
0点赞
发布博客于 2 年前

MongoDB分片

经常对配置服务器做数据备份,应常在执行集群维护操作之前备份配置服务器的数据;基于片键第二个字段的范围可能会出现在多个块中,如果只根据第二个片键值查询时就必须查看几乎所有的块;具有相同片键的文档必须保存在相同的块中,因此块只能在片键的值发生变化的点对块进行拆分;拥有不同的片键值是非常重要的;“拆分风暴”:mongos不断重复发起拆分请求却因为配置服务器不可用而无法进行拆分的过程;...
原创
46阅读
0评论
0点赞
发布博客于 2 年前

Java注解

1、定义:Java提供了一种源程序中的元素关联任何信息和任何元数据的途径和方法;2、注解的分类2.1 按照运行机制分|- 源码注解 注解只在源码中存在,编译成*.class文件就不存在了;|- 编译时注解 注解在源码和*.class文件中都存在;像@Override、@Deprecated、@Suppvisewarnings;|- 运行时注解 在运行阶段还起作用,甚至会影响运行逻...
原创
35阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】7、代理模式 - proxy pattern

代理模式核心作用:通过代理,控制对象的访问;可以详细控制访问某个对象的方法,在调用方法前做前置处理,调用方法后做后置处理;代理模式的应用:远程代理,为一个对象在不同的地址空间提供局部代表;这样可以隐藏一个对象存在于不同地址空间的事实; 虚拟代理,根据需要创建开销很大的对象,通过虚拟代理来存放实例化需要很长时间的真实对象;如浏览器加载图片时通过虚拟代理来替代了真实的图片,此时代理存储了...
原创
25阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】6、装饰模式

装饰模式 Decorator:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。动态地为一个对象增加新的功能,一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能;使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。装饰模式decorator,也叫包装器模式wrapper;降低系统耦合度,可以动态的增加或删除对象的职责,并...
原创
38阅读
0评论
0点赞
发布博客于 2 年前

Mac 常用IDEA快捷键

Mac 键盘符号和修饰键说明⌘ ——>Command ⇧ ——>Shift ⌥——>Option ⌃ ——>Control ↩︎ ——>Return/Enter ⌫——>Delete ⌦ ——>向前删除键(Fn + Delete) ↑ ——>上箭头 ↓ ——>下箭头 ← ——>...
原创
35阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】5、依赖倒转原则和里氏代换原则

依赖倒转原则:抽象不应该依赖细节,细节应该依赖于抽象;针对接口编程,不要对实现编程;高层模块不应该依赖底层模块,两个都应该依赖抽象; 抽象不应该依赖细节,细节应该依赖抽象;里氏代换原则一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里,把父类都替换成它的子类,程序的行为没有变化。简单说,子类型必须能够替换掉它们的父...
原创
50阅读
0评论
1点赞
发布博客于 2 年前

【设计模式系列学习笔记】4、开放-封闭原则

The Open-Closed Principle OCP开放-封闭原则,软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。两个特征:对于扩展开放 Open for extension对于更改封闭 Closed for modification无论模块是多么的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出...
原创
36阅读
0评论
1点赞
发布博客于 2 年前

【设计模式系列学习笔记】3、单一职责原则

单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。软件设计真正要做的许多内容,就是发现职责,并把那些职责相互分离。如果能够想到多于一个的动机去改变一个类,那么这个类就鱼油多于一个的职责。...
原创
46阅读
0评论
1点赞
发布博客于 2 年前

【设计模式系列学习笔记】2、策略模式

策略模式:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。使用策略模式,简单实现厂商打折策略抽象类,定义打折抽象方法,让子类具体实现打折逻辑;public abstract class CashSuper { public abstract double acceptCash(double money);}原价...
原创
36阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】UML类图

UML:Unified Modelling Language 统一建模语言类图分三层:第一层,显示类的名称,如果是抽象类,则用斜体显示; 第二层,是类的特性,通常就是字段和属性; 第三层,是类的操作,通常是方法或行为;二三层中,“+”表示public,“-”表示private,“#”表示protected;接口图矩阵表示法:与类图区别主要是顶端有<<in...
原创
60阅读
0评论
0点赞
发布博客于 2 年前

【设计模式系列学习笔记】1、简单工厂模式

如果说数学是思维的体操,那设计模式就是面向对象编程思维的体操;简易计算器类结构图:操作类,定义两个操作数,并声明抽象方法getResult(),具体实现由子类完成;public abstract class Operation { private double numberA; private double numberB; public abstr...
原创
42阅读
0评论
0点赞
发布博客于 2 年前

Linux中iptables那点儿事儿

1、NetFilter是Linux系统核心层内部的一个数据包处理模块2、Hook point数据包在NetFilter中的挂载点,包括PRE_ROUTING INPUT OUTPUT FORWARD POST_ROUTINGiptables命令最终会调用netfilter,通过hook point挂载到网络层五个不同的挂载点,数据包通过这些挂载点,进行相应的操作,实现...
转载
97阅读
0评论
1点赞
发布博客于 2 年前

【Java设计模式】代理模式

Proxy Pattern现实生活中,租房时的中介就相当于代理对象,房东相当于实际对象,我们相当于客户端,通过中介把房东的房子租下来;代理的外部功能和实际对象一般是一样的,用户与代理打交道,不直接接触实际对象;代理存在的价值:节省成本比较高的实际对象的创建开销,按需延迟加载; 执行权限检查,代理检查权限后,再调用实际对象; 屏蔽网络差异和复杂性,代理在本地,而实际对象在其他服务...
原创
53阅读
0评论
0点赞
发布博客于 2 年前

Linux 正则表达式

一、基础知识匹配操作符\ 转义字符 . 匹配任意单个字符 [1249a],[^12],[a-k] 字符序列单字符占位 ^ 行首 $ ...
原创
47阅读
0评论
0点赞
发布博客于 2 年前

Linux vi/vim 常用命令

1、vim 全屏编辑器1.1 打开文件vim /path/to/somefile vim +# :打开文件,并定位于第#行 vim +:打开文件,定位至最后一行 vim +/PATTERN : 打开文件,定位至第一次被PATTERN匹配到的行的行首1.2 关闭文件1.2.1 末行模式::q 退出 没有动过文件 :wq 保存并退出 动过了,不后悔 :q! 不保存...
原创
72阅读
0评论
0点赞
发布博客于 2 年前

【大数据学习笔记】Hive与HBase整合

1、配置1.1 如果是自己通过tar包自行搭建的hadoop集群,需要如下两步配置:1.1.1 拷贝jar包(1)将Hive lib路径内的hive-hbase-handler-*.jar拷贝到HBase lib路径下(2)将HBase lib下所有jar包拷贝到Hive lib路径下1.1.2 在Hive的配置文件hive-site.xml中增加如下属性<prop...
原创
78阅读
0评论
0点赞
发布博客于 2 年前

【大数据学习笔记】sqoop

1、简介将关系型数据库与hadoop数据进行转换的工具官网文档地址:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html我用的是1.4.6版本,集群使用Ambari搭建,在任意一台服务节点上安装sqoop客户端;sqoop由client端直接接入hadoop,任务通过解析生成对应的MapRecue执行sqoop中导入与导出...
原创
131阅读
0评论
1点赞
发布博客于 2 年前

【大数据学习笔记】HBase数据模型及架构简介

1、HBase简介Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库;利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为其分布式协同服务;主要用来存储非结构化和半结构化的松散数据(列存 NoSQL 数据库);2、HBase数据模型rowkey ...
原创
270阅读
0评论
0点赞
发布博客于 2 年前

IntelliJ IDEA License Server本地搭建教程

1、下载文件IntelliJIDEALicenseServer(v1.6).zip下载链接:https://pan.baidu.com/s/1pYp5Tjy-eIvfb_Z--qIXUg 密码:sozy2、找到自己操作系统的版本,我这里使用IntelliJIDEALicenseServer_linux_amd64,上传到服务器后运行./IntelliJIDEALicenseServ...
原创
4255阅读
2评论
0点赞
发布博客于 2 年前

【JVM系列】1、Run-Time Data Areas 运行时数据区

Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。1、Thepc(program counter)Register - 程序计数器Java虚拟机可以同时支持许多执行线程,每个Java虚拟机线程都有自己的程序计数器寄存器。在任何一个确定时刻,一个处理器内核都会执行一条线程中的指令,如果执行的不是native方法,计数器记录的是正在执行的虚拟机指令的地址;如果执行的是nat...
原创
106阅读
0评论
0点赞
发布博客于 2 年前

解决Cannot change version of project facet Dynamic Web module to 3.1

解决Cannot change version of project facet Dynamic Web module to 3.1使用Eclipse新建基于Maven的Web项目时,选择ArchetypeId为maven-archetype-webapp时,由于Catalog版本问题,servlet使用的是2.3,如需要提高为3.1需要一下几步解决;1、修改servlet版本...
原创
99阅读
0评论
0点赞
发布博客于 2 年前

Maven学习笔记

一、Maven简介Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。apache-maven-3.3.3 |- bin 存放命令 |- boot |- plexus-classworlds-2.5.2.jar 类加载器的框架 |- co...
原创
70阅读
0评论
0点赞
发布博客于 2 年前

jstack分析java线程

找到java线程的pidps -ef | grep java打印jstack输出信息到文件jstack pid &gt; ./dump统计[root@server ~]# grep java.lang.Thread.State dump | awk '{print $2$3$4$5}' | sort | uniq -c 41 RUNNABLE 1 T...
原创
98阅读
0评论
0点赞
发布博客于 2 年前

使用Eclipse,Maven简单搭建Spring+MyBatis

1、新建一个Maven Project使用Eclipse自带的Maven插件,自动创建一个基于Maven的Web工程;(前提是开发环境一定要配置好Maven)选择archetype为maven-archetype-webapp:设置: GroupId:com.study(正式项目为公司网址倒写) ArtifactId:SMPro(项目...
原创
162阅读
0评论
0点赞
发布博客于 2 年前

照片尺寸对照表

使用300PPI计算照片尺寸 长宽mm 分辨率 长宽比 5英寸(3R) 127*89 1500*1050 5:3.5 全景5英寸(3D) 127*95.2 1500*1125 4:3 6英寸(4R) 152*102 1800*1200 3:2 全景6英寸(4D) 152*114 1800*135...
原创
1309阅读
0评论
0点赞
发布博客于 2 年前

打赏

各位客官,如果小弟写的博客文章能够对您有一丝丝的帮助,小弟内心是非常高兴的;我会一直写下去,希望能够帮助到更多的人,并且让自己的技术能够得到总结和提升,写出更好的帖子来,这里有钱的捧个钱场,没钱的捧个人场,谢谢大家!!!【微信】二维码:【支付宝】二维码:...
原创
170阅读
1评论
0点赞
发布博客于 2 年前

【高并发系列】26、并行排序

1、先回顾一下冒泡排序public class BubbleSort { public static void bubbleSort(int[] arr) { for (int i = arr.length - 1; i &gt; 0; i--) { for (int j = 0; j &lt; i; j++) { if (arr[j] &gt; arr[j + 1]) ...
原创
315阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】25、并行搜索

简单的策略实现并行搜索:将原始数据集合按照期望的线程数量分割;每个线程各自独立搜索,当其中有一个线程找到数据后,立即返回结果即可;/** * 并行搜索 * * @author daniel */public class ParallelSearch { // 整型数组,保存需要查找的元素 static int[] arr; // 线程池 static Executor...
原创
370阅读
0评论
0点赞
发布博客于 2 年前

【Spark学习笔记】5、Java版-算子系列之mapPartitions(f:Iterator[T] => Iterator[U]) : RDD[T] => RDD[U]

源码/** * Return a new RDD by applying a function to each partition of this RDD. * * `preservesPartitioning` indicates whether the input function preserves the partitioner, which * should be `fal...
原创
163阅读
0评论
0点赞
发布博客于 2 年前

【Spark学习笔记】4、Java版-算子系列之flatMap(f:T => Seq[U]) : RDD[T] => RDD[U]

flatMap源码/** * Return a new RDD by first applying a function to all elements of this * RDD, and then flattening the results. */def flatMap[U: ClassTag](f: T =&gt; TraversableOnce[U]): RDD[U] ...
原创
118阅读
0评论
0点赞
发布博客于 2 年前

【Spark学习笔记】3、Java版-算子系列之map(f:T => U) : RDD[T] => RDD[U]

map算子源码/** * Return a new RDD by applying a function to all elements of this RDD. */def map[U: ClassTag](f: T =&gt; U): RDD[U] = withScope { val cleanF = sc.clean(f) new MapPartitionsRDD[U, ...
原创
360阅读
0评论
0点赞
发布博客于 2 年前

【Spark学习笔记】2、Java版-算子系列之filter(f:T => Boolean) : RDD[T] => RDD[T]

filter算子源码def filter(f: T =&gt; Boolean): RDD[T] = withScope { val cleanF = sc.clean(f) new MapPartitionsRDD[T, T]( this, (context, pid, iter) =&gt; iter.filter(cleanF), preservesPa...
原创
305阅读
0评论
1点赞
发布博客于 2 年前

【Spark学习笔记】1、Java-Maven-Spark项目环境搭建

现在学习个新技术,虽然网上资料多得很,但是质量参差不齐!恕在下愚昧,实在想不懂那些都不验证帖子里技术的正确性就直接转载的那些人,心里是怎么想的!你要是感觉帖子好,请默默的收藏到你的收藏夹里,等你确定帖子内容没错的时候你再转载好不好?你不知道你这样做,对这个技术的新手来说,无疑是灾难!你埋那么多坑,是怕别人学会了超越你吗?哎,言归正传,以下是我自己的学习总结,如果有哪里有错误、有问题,欢迎批评指...
原创
693阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】24、JMH性能测试那些事儿

JMH官网JMH is a Java harness for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM.Java微基准测试框架JMH(Java Microbenchmark Harness)...
原创
378阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】23、JDK并发容器 - 随机数据结构 - 跳表 SkipList

跳表是一种可以用来快速查找的数据结构,类似平衡树,但平衡树的插入和删除很可能导致平衡树的全局调整,而跳表只需要局部调整;在高并发情况下,需为保证线程安全,对于平衡树需要一个全局锁,而对于跳表只需要部分锁即可;跳表的时间复杂度是O(log n),空间复杂度是O(n);跳表具有如下性质:(1) 由很多层结构组成(2) 每一层都是一个有序的链表(3) 最底层(Level 1)的链表包含所有元素...
原创
128阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】22、JDK并发容器 - 数据共享 BlockingQueue

BlockingQueue适合作为数据共享的通道,可以让服务线程在队列为空时进行等待,当有新的消息进入队列后,自动将线程唤醒;BlockingQueue是一个接口,其实现如下图:ArrayBlockingQueue基于数组实现,适合做有界队列;LinkedBlockingQueu基于链表实现,适合做无界队列;以ArrayBlockingQueue为例,看下源码是如何实现的;内部...
原创
56阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】21、JDK并发容器 - 高效读取 CopyOnWriteArrayList

对于CopyOnWriteArrayList来说,读取之间不加锁,而且写入也不阻塞读取操作,只有写入和写入之间需要同步等待;读取:/** The array, accessed only via getArray/setArray. */private transient volatile Object[] array;public E get(int index) { re...
原创
29阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】20、JDK并发容器 - ConcurrentLinkedQueue

ConcurrentLinkedQueue使用链表作为其数据结构,节点Node定义如下:private static class Node&lt;E&gt; { // 目标元素 volatile E item; // 当前节点的下一个元素 volatile Node&lt;E&gt; next; /** * Constructs a new...
原创
44阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】19、JDK并发容器 - 线程安全的HashMap、List

1、Map为防止多线程环境中使用HashMap出现问题,需要保证线程安全,可以使用Collections工具类下得synchronizedMap()方法:public static &lt;K,V&gt; Map&lt;K,V&gt; synchronizedMap(Map&lt;K,V&gt; m) { return new SynchronizedMap&lt;&gt;(m);...
原创
118阅读
0评论
0点赞
发布博客于 2 年前

spark-1.6.3.zip

spark-1.6.3源码,学习spark1.x必备源码,从github上下载超级慢。
zip
发布资源于 2 年前

【高并发系列】18、线程池那些事儿2 - 内部实现

线程池内部实现1、常用线程池定义public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,...
原创
54阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】17、线程池那些事儿1

多线程软件设计方法可以最大限度地发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能;JDK提供的Execotur框架:1、固定大小线程池newFixedThreadPool5个固定大小的线程池,提交10个任务,分2批执行任务;public class ThreadPoolDemo { public static class MyTask implements Runn...
原创
65阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】16、Guava的RateLimiter限流

限流的必要性:任何应用或模块组件中,如果请求速率超过了访问速率上限,多余的请求无法处理,严重时可能压垮系统导致所有请求都无法有效处理;简单限流算法:在给定单位时间内,使用计数器统计收到的请求数量,超过上限时,多余的请求丢弃或等待;这种算法有问题,很难控制边界时间上的请求;假如单位时间t内请求上限为n,0~t/2时间内无请求,t/2~t请求n,t~3t/2请求n,3t/2~2t无请求,分别在0~...
原创
266阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】15、线程阻塞工具类 LockSupport

1、定时阻塞java.util.concurrent.locks.LockSupport可以在线程内任意位置让线程阻塞;与Thread.suspend()方法比,弥补了由于resume()方法在suspend()方法之前发生而导致线程无法继续执行的情况;与Object.wait()方法比,不需要首先获得某个对象的锁,也不会抛出InterruptedException异常;使用Loc...
原创
74阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】14、循环栅栏 CyclicBarrier

java.util.concurrent.CyclicBarrier与CountDownLatch非常类似,也可以实现线程间的计数等待,但其功能更为复杂强大;Barrier意为栅栏,障碍物,阻止线程继续执行,要求在栅栏外等待;Cyclic意为循环,这个计数器可以循环使用;示例:司令要求10个士兵一起去完成一项任务;首先要求10个士兵集合报到,然后一起去执行任务,等10个士兵把各自任务都...
原创
91阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】13、倒计数器 CountDownLatch

java.util.concurrent.CountDownLatch用来控制线程等待,让指定线程等待直到计数结束再开始执行;火箭发射前倒计时,main方法等待10个检查线程都检查完毕后,再执行发射;public class CountDownLatchDemo implements Runnable { private static final CountDownLatch COUN...
原创
56阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】12、读写锁 ReadWriteLock

java.util.concurrent.locks.ReadWriteLock是JDK5提供的读写分离锁;读-读不互斥:读读之间不阻塞; 读-写互斥:读阻塞写,写阻塞读; 写-写互斥:写写阻塞;在系统中,如果读操作次数远远大于写操作次数,则读写锁可以发挥最大的功效,提升系统的性能;public class ReadWriteLockDemo { private static L...
原创
46阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】11、允许多个线程同时访问 - 信号量 Semaphore

构造方法Semaphore(int permits)Semaphore(int permits, boolean fair)信号量主要逻辑方法如下:public void acquire() throws InterruptedExceptionpublic void acquireUninterruptibly()public boolean tryAcquire()pu...
原创
185阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】10、重入锁搭档 - Condition

java.util.concurrent.locks.Lock接口方法如下:void lock();void lockInterruptibly() throws InterruptedException;boolean tryLock();boolean tryLock(long time, TimeUnit unit) throws InterruptedException;vo...
原创
36阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】9、可重入锁那些事儿

重入锁使用java.util.concurrent.locks.ReentrantLock实现;重入锁与synchronized关键字相比需要显示声明操作过程,对逻辑控制的灵活要远远优于synchronized关键字;简单例子:public class ReentrantLockDemo implements Runnable { private static ReentrantL...
原创
37阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】8、synchronized关键字

线程安全是并行程序的根基;volatile关键字只能保证一个线程修改数据后,其他线程可见这个修改;但两个或多个线程同时修改某一个数据时依然冲突;以下例子最终结果小于20000000,同一时刻2个线程读取i的值后分别执行i++操作,虽然执行了2次i++操作,但i的值只增加了1次;public class VolatileErrorDemo implements Runnable { ...
原创
33阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】7、线程优先级

优先级高的线程在竞争资源时会更有优势,更可能抢占资源,只是一个概率问题;线程的优先级调度和底层操作系统有密切的关系,在各个平台上表现不一,并且无法精准控制,因此在要求严格的场合,需要开发者在应用层解决线程调度问题;线程优先级用内置3个静态标量表示:/** * The minimum priority that a thread can have. */public final ...
原创
145阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】6、守护线程 Daemon

守护线程:完成系统性服务;用户线程:完成业务操作;一个Java应用内只有守护线程时,Java虚拟机会自动退出;例子中,将线程设为守护线程,main方法执行2秒后执行结束,只剩下守护线程,程序退出,只打印2条记录;如果不设置守护线程,则无限打印下去,程序不会自动退出;public class DaemonThreadDemo { public static class Daemo...
原创
56阅读
0评论
0点赞
发布博客于 2 年前

【高并发系列】5、线程组

建议在创建线程组或线程时,都设置好名字方便后续调试时方便识别;public class ThreadGroupDemo implements Runnable { @Override public void run() { String name = Thread.currentThread().getThreadGroup().getName() + "-" + Thread.cu...
原创
243阅读
0评论
0点赞
发布博客于 2 年前