阿里云出现大规模故障;2023 最佳发明榜单;愤怒的南瓜|思否技术圈周刊

2023-11-17
阅读 3 分钟
623
双十一刚结束,阿里云就大面积故障,持续长达 3 个半小时。据阿里云公告,故障源于某个底层服务组件,影响地域涵盖了国内以及海外多个国家。“淘宝崩了”、“外卖崩了”、“闲鱼崩了”等迅速冲上热搜。大批依赖阿里云的设施随之崩溃:外卖派送停止、超市无法结账、停车场不抬杆。甚至洗衣机、直饮水机和充电桩等服务也停止运转。
封面图

深入理解Java内存模型(七)——总结

2014-04-18
阅读 5 分钟
4.9k
顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。

深入理解Java内存模型(六)——final

2014-04-14
阅读 5 分钟
4.3k
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操...

深入理解Java内存模型(五)——锁

2014-04-09
阅读 8 分钟
5.7k
锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码:

深入理解Java内存模型(一)——基础

2014-03-14
阅读 5 分钟
7.9k
在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。

Java同步块简介

2014-03-12
阅读 4 分钟
3.5k
Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java同步示例 Java同步关键字(synchronized) Java中的同步块用synchronized标记。同步块在Java中是同步...

Java重入锁死简介

2014-02-27
阅读 2 分钟
5.4k
当一个线程重新获取锁,读写锁或其他不可重入的同步器时,就可能发生重入锁死。可重入的意思是线程可以重复获得它已经持有的锁。Java的synchronized块是可重入的。因此下面的代码是没问题的:

Java中的读写锁

2014-02-24
阅读 10 分钟
3.5k
假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存...

Slipped Conditions简析

2014-02-21
阅读 6 分钟
2.5k
所谓Slipped conditions,就是说, 从一个线程检查某一特定条件到该线程操作此条件期间,这个条件已经被其它线程改变,导致第一个线程在该条件上执行了错误的操作。这里有一个简单的例子:

2013年度Python并发模块

2014-02-18
阅读 1 分钟
3.9k
Pycoders周刊根据读者对周刊文章的点击数据,评选出了2013年最受关注的Python并发模块。 pulsar (github.com) 部件新web 服务器走起! 有趣的事件驱动的并发框架 ! 兼容从2.6+到pypy 的所有python 版本! toro (github.com) 同步化的Tornado 协程支持 offset (github.com) Offset Go 的并发模式在 Python 中的实现.请参考...

JAVA线程间通信简介

2014-01-24
阅读 6 分钟
21.7k
线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。 例如,线程B可以等待线程A的一个信号,这个信号会通知线程B数据已经准备好了。本文将讲解以下几个JAVA线程间通信的主题: 1、通过共享对象通信 2、忙等待 3、wait(),notify()和notifyAll() 4、丢失的信号 5、假唤醒 6、多...

Java线程池架构(二)多线程调度器

2014-01-22
阅读 14 分钟
6.4k
在前面介绍了java的多线程的基本原理信息:《Java线程池架构原理和源码解析》,本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分。

Java线程池架构(一)原理和源码解析

2014-01-22
阅读 10 分钟
8.5k
文章中其实说明了外部的使用方式,但是没有说内部是如何实现的,为了加深对实现的理解,在使用中可以放心,我们这里将做源码解析以及反馈到原理上,Executors工具可以创建普通的线程池以及schedule调度任务的调度池,其实两者实现上还是有一些区别,但是理解了ThreadPoolExecutor,在看ScheduledThreadPoolExecutor就非...

Java中的锁

2014-01-21
阅读 5 分钟
8.7k
锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂。因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字(译者注:这说的是Java 5之前的情况)。

无锁并发和无等待并发

2014-01-20
阅读 1 分钟
5.3k
在无锁系统中,当任何特定的运算被阻塞的时候,所有CPU可以继续处理其他的运算。换种方式说,在无锁系统中,当给定线程被其他线程阻塞的时候,所有CPU可以不停的继续处理其他工作。无锁算法大大增加系统整体的吞吐量,因为它只偶尔会增加一定的交易延迟。大部分高端数据库系统是基于无锁算法而构造的,以满足不同级别。

详细分析Java中断机制

2014-01-17
阅读 7 分钟
3.9k
当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务。Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制。

JAVA 多线程和并发基础面试问答

2014-01-17
阅读 6 分钟
14.6k
多线程和并发问题是 Java 技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:非常赞同这个观点)

从Java视角理解系统结构(三)伪共享

2014-01-15
阅读 7 分钟
4.7k
从我的前一篇博文中, 我们知道了CPU缓存及缓存行的概念, 同时用一个例子说明了编写单线程Java代码时应该注意的问题. 下面我们讨论更为复杂, 而且更符合现实情况的多核编程时将会碰到的问题. 这些问题更容易犯, 连j.u.c包作者Doug Lea大师的JDK代码里也存在这些问题.

从Java视角理解系统结构(二)CPU缓存

2014-01-15
阅读 4 分钟
3.9k
众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多. 其实在30年前, CPU的频率和内存总线的频率在同一个级别, 访问内存只比访问CPU寄存器慢一点儿. 由于内存的发展受到技术及成本的限制, 现在获取内存中的一条数据大概需要200多个CPU周期(CPU cycl...

基于锁的并发算法 vs 无锁的并发算法

2014-01-14
阅读 3 分钟
3.2k
上周在由Heinz Kabutz通过JCrete 组织的开放空间会议(unconference)上,我参加一个新的java规范 JSR166 StampedLock 的审查会议。 StampedLock 是为了解决多个readers 并发访问共享状态时,系统出现的内存地址竞争问题。在设计上通过使用乐观的读操作, StampedLock 比 ReentrantReadWriteLock 更加高效;

双重检查锁定与延迟初始化

2014-01-13
阅读 8 分钟
3.9k
在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码:

多线程的优点

2014-01-10
阅读 2 分钟
4.2k
尽管面临很多挑战,多线程有一些优点使得它一直被使用。这些优点是: 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 资源利用率更好想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要: {代码...} 从磁盘中读取...

可见性问题实例

2014-01-10
阅读 4 分钟
4.9k
说到并发安全时,我们常提及可见性的问题,通俗点讲就是线程1看不到线程2写入变量v的值(更专业的解释以及是什么导致可见性问题,又该如何解决,见扩展阅读),但一直偏于理论,实际中有没有因可见性而导致问题的例子呢?回答是肯定的,接下来我们一起来看几个例子。

非阻塞同步算法实战(三)-LatestResultsProvider

2014-01-09
阅读 8 分钟
2.9k
阅读本文前,需要读者对happens-before比较熟悉,了解非阻塞同步的一些基本概念。本文主要为happens-before法则的灵活运用,和一些解决问题的小技巧,分析问题的方式。

非阻塞同步算法实战(二):BoundlessCyclicBarrier

2014-01-08
阅读 5 分钟
3.3k
相比上一篇而言,本文不需要太多的准备知识,但技巧性更强一些。因为分析、设计的过程比较复杂繁琐,也限于篇幅,所以,主要展示如何解决这些需求,和讲解代码。另外,所讲的内容也是后一篇实战中需要用到的一个工具类。

非阻塞同步算法实战(一):ConcurrentLinkedQueue

2014-01-07
阅读 6 分钟
7.9k
上个月,我被安排独自负责一个聊天系统的服务端,因为一些原因,我没使用现成的开源框架,网络那块直接使用AIO,收数据时,因为只会从channel里过来,所以不需要考虑同步问题;但是发送数据时,因为有聊天消息的转发,所以必需处理这个同步问题。AIO中,是处理完一个注册的操作后,再执行我们定义的方法,此时,如果还有...

Java NIO 系列教程

2014-01-06
阅读 1 分钟
9.9k
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。

三种避免死锁的思路

2014-01-06
阅读 3 分钟
8.5k
死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。死锁原理请参考此文。 在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术: 加锁顺序 加锁时限 死锁检测 加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁...

Fork/Join框架简介

2014-01-04
阅读 6 分钟
6.4k
Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

浅谈死锁原理

2014-01-04
阅读 3 分钟
10.5k
例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了。线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情。为了得到彼此的对象(A和B),它们将永远阻塞下去。这种情况就是一个死锁。