[Java并发-17-并发设计模式] Immutability模式:如何利用不变性解决并发问题?

2019-07-04
阅读 4 分钟
1.5k
解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话说,就是变量一旦被赋值,就不允许修改了(没有写操作);没有修改操...

[Java并发-16] CompletionService:批量执行异步任务

2019-06-27
阅读 4 分钟
7.5k
上面的这个方案本身没有太大问题,但是有个地方的处理需要你注意,那就是如果获取电商 S1 报价的耗时很长,那么即便获取电商 S2 报价的耗时很短,也无法让保存 S2 报价的操作先执行,因为这个主线程都阻塞在了 f1.get(),那我们如何解决了?

[Java并发-15] CompletableFuture: 异步编程

2019-06-25
阅读 7 分钟
13.1k
前面我们不止一次提到,用多线程优化性能,其实不过就是将串行操作变成并行操作。如果仔细观察,你还会发现在串行转换成并行的过程中,一定会涉及到异步化,例如下面的示例代码,现在是串行的,为了提升性能,我们得把它们并行化。

[Java并发-14] Future: 优雅的使用多线程

2019-06-23
阅读 5 分钟
11.1k
上一篇,我们详细介绍了如何创建正确的线程池,那创建完线程池,我们该如何使用呢?在上一篇文章中,我们仅仅介绍了 ThreadPoolExecutor 的 void execute(Runnable command) 利用这个方法虽然可以提交任务,但是却没有办法获取任务的执行结果(execute() 方法没有返回值)。而很多场景下,我们又都是需要获取任务的执行...

[Java并发-13] ThreadPoolExecutor: 如何创建正确的线程池

2019-06-23
阅读 4 分钟
4.5k
虽然在 Java 语言中创建线程看上去就像创建一个对象一样简单,只需要 new Thread() 就可以了,但实际上创建线程远不是创建一个对象那么简单。创建对象,仅仅是在 JVM 的堆里分配一块内存而已;而创建一个线程,却需要调用操作系统内核的 API,然后操作系统要为线程分配一系列的资源,这个成本就很高了,所以线程是一个重...

[Java并发-12] 原子类:无锁工具类的典范

2019-06-16
阅读 6 分钟
1.9k
前面我们多次提到一个累加器的例子,示例代码如下。在这个例子中,add10K() 这个方法不是线程安全的,问题就出在变量 count 的可见性和 count+=1 的原子性上。可见性问题可以用 volatile 来解决,而原子性问题我们前面一直都是采用的互斥锁方案。

[Java并发-11] 并发容器的使用

2019-05-26
阅读 4 分钟
1.8k
Java 1.5 之前提供的同步容器虽然也能保证线程安全,但是性能很差,而 Java 1.5 版本之后提供的并发容器在性能方面则做了很多优化,并且容器的类型也更加丰富了。下面我们就对比二者来学习这部分的内容。

[Java并发-10] ReadWriteLock:快速实现一个完备的缓存

2019-05-13
阅读 3 分钟
2.4k
大家知道了Java中使用管程同步原语,理论上可以解决所有的并发问题。那 Java SDK 并发包里为什么还有很多其他的工具类呢?原因很简单:分场景优化性能,提升易用性

[Java并发-9]Lock和Condition(下) Dubbo如何用管程实现异步转同步?

2019-05-12
阅读 3 分钟
3.2k
在上一篇文章中,我们讲到 Java SDK 并发包里的 Lock 有别于 synchronized 隐式锁的三个特性:能够响应中断、支持超时和非阻塞地获取锁。那今天我们接着再来详细聊聊 Java SDK 并发包里的 Condition。

[Java并发-8]Lock和Condition(上) 隐藏在并发包中的管程

2019-05-12
阅读 4 分钟
1.8k
Java SDK 并发包内容很丰富。但是最核心的还是其对管程的实现。因为理论上利用管程,你几乎可以实现并发包里所有的工具类。在前面我们提到过在并发编程领域,有两大核心问题:一个是互斥:即同一时刻只允许一个线程访问共享资源;另一个是 同步:即线程之间如何通信、协作。

[Java并发-7]java的线程小节

2019-05-11
阅读 7 分钟
1.5k
在 Java 领域,实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念,虽然各种不同的开发语言如 Java、C# 等都对其进行了封装,但原理和思路都是相同都。Java 语言里的线程本质上就是操作系统的线程,它们是一一对应的。

[Java并发-6]“管程”-java管程初探

2019-04-27
阅读 5 分钟
5.2k
并发编程这个技术领域已经发展了半个世纪了。有没有一种核心技术可以很方便地解决我们的并发问题呢?这个问题, 我会选择 Monitor(管程)技术。Java 语言在 1.5 之前,提供的唯一的并发原语就是管程,而且 1.5 之后提供的 SDK 并发包,也是以管程技术为基础的。除此之外,C/C++、C# 等高级语言也都支持管程。

[Java并发-5]用“等待-通知”机制优化循环等待

2019-04-19
阅读 3 分钟
2.9k
由上一篇文章你应该已经知道,在 破坏占用且等待条件 的时候,如果转出账本和转入账本不满足同时在文件架上这个条件,就用死循环的方式来循环等待,核心代码如下:

[Java并发-4]解决Java死锁的问题

2019-04-18
阅读 5 分钟
2.4k
在上一篇中,我们尝试使用了 Account.class作为互斥锁,来解决转账问题。但是很容易发现这样,所有的转账操作都是串行的,性能太差了。

java单例模式几种实现方式分析

2019-04-10
阅读 2 分钟
1.2k
这种方法可以实现延时加载,但是有一个致命弱点:线程不安全(可见性,有序性)。如果有两条线程同时调用getSingleton()方法,就有很大可能导致重复创建对象。

[Java并发-3]Java互斥锁,解决原子性问题

2019-04-10
阅读 7 分钟
2.8k
在前面的分享中我们提到。 一个或者多个操作在 CPU 执行的过程中不被中断的特性,称为“原子性” 思考:在32位的机器上对long型变量进行加减操作存在并发问题,什么原因!? 原子性问题如何解决 我们已经知道原子性问题是线程切换,而操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换。 在...

[Java并发-2]Java如何解决可见性问题的

2019-03-18
阅读 4 分钟
3k
之前我们说了:1,可见性2,原子性3,有序性3个并发BUG的之源,这三个也是编程领域的共性问题。Java诞生之处就支持多线程,所以自然有解决这些问题的办法,而且在编程语言领域处于领先地位。理解Java解决并发问题的方案,对于其他语言的解决方案也有触类旁通的效果。

[Java并发-1]入门:并发编程Bug的源头

2019-03-18
阅读 3 分钟
1.8k
背景介绍 如何解决并发问题,首先要理解并发问题的实际源头怎么发生的。 现代计算机的不同硬件的运行速度是差异很大的,这个大家应该都是知道的。 计算机数据传输运行速度上的快慢比较: CPU > 缓存 > I/O 如何最大化的让不同速度的硬件可以更好的协调执行,需要做一些“撮合”的工作 CUP增加了高速缓存来均衡与缓存...

[Spring Security 5.2.0] 8.1.3 Authentication

2019-02-14
阅读 7 分钟
1.6k
Spring Security can participate in many different authentication environments. While we recommend people use Spring Security for authentication and not integrate with existing Container Managed Authentication, it is nevertheless supported - as is integrating with your own proprietary authenticati...

[Spring Security 5.2.0 翻译] 8 Architecture and Implementation

2019-02-14
阅读 11 分钟
1.4k
Once you are familiar with setting up and running some namespace-configuration based applications, you may wish to develop more of an understanding of how the framework actually works behind the namespace facade. Like most software, Spring Security has certain central interfaces, classes and conc...

关于ClassLoader的学习笔记,详解版

2019-01-19
阅读 8 分钟
1.8k
ClassLoader 详解 ClassLoader 做什么的? 延迟加载 各司其职 ClassLoader 传递性 双亲委派 Class.forName 自定义加载器 Class.forName vs ClassLoader.loadClass 钻石依赖 分工与合作 Thread.contextClassLoader ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上的文章也...

gRPC 初探

2017-10-10
阅读 4 分钟
8.4k
gRPC 初探 前言 安装 使用 参考 前言 gRPC 出来很久了,很多地方都在使用中。因为是google 出品的所以一直受到很大的关注。 在实际的学习中,和其他的rpc框架还是有些特点: 跨语言,如果项目是跨语言通信的可以考虑使用gRPC。 gRPC 基于 HTTP/2 标准设计,使其在移动设备上表现更好,更省电和节省空间占用。 通信格式默...

[elk]快速接入elk之 Elasticsearch动态mapping

2017-09-24
阅读 4 分钟
4.5k
Elk stack 是个好东西大家都知道了,并且就跟全家桶一样都在使用中。但是对于有一定业务量,并初次使用的公司来说,如何快速接入还是有一定技巧和方法的。

PHP xdebug 调试工具安装与使用

2017-09-24
阅读 4 分钟
22.2k
> 工欲善其事必先利其器,学习一门新语言,调试器的使用必不可少,本文分享一下PHP调试器的使用。 PHP目前有两种流行的调试器, Xdebug Zend Debugger 我在学习和研究过程中,发现网上的各种信息过于凌乱,感到痛苦,影响理解和使用。今天我以Xdebug为例,先解释其基本的工作原理,再说明生产过程中如何使用,希望能...

PHP 规范说明与工具

2017-09-24
阅读 4 分钟
2.5k
> 作为一个新手,写出规范的代码也是一门必修课,除了阅读相应的代码规范文档之外,充分利用相关的工具能使得进阶之路事半功倍。今天这篇分享将简单地梳理一下 PHP 规范,并介绍一个代码检查工具 Code Sniffer,结合 PHPStorm 以及 GIT 进行实践。

[elk]基于elk的业务日志格式设计

2017-01-29
阅读 2 分钟
7.8k
我们跳过搭建过程(网上太多了)。通过docker搭建好了elk那一套(明显单机版),我要监控测试和线上,所以是个多采集的环境,使用了官方推荐的最新的filebeat就行log聚合,格式化还是在master用logstash。

[ElastAlert]介绍和安装-1

2017-01-29
阅读 6 分钟
13.6k
写在前面的话 最近干起了运维的活;代码改造,搭建elk,搭建告警,此处做些个总结。 环境介绍 Ubuntu14 Elasticsearch 5.1.2Kibana 5.1.2 安装 官网网址: [链接] 执行: {代码...} 注意如果你用的是elk5.0, elastalert master还不支持,你需要自己切换分支到 support_es5 结构介绍 安装完成后会自带三个命令: elastale...