JAVA ’ 目录归档

认知升级-成败取决于见识

最近在读吴军的《谷歌方法论》和《见识》,结合自己的理解分享一下里面的观点。一本书其实观点也就一页纸这么多,其他的内容都是在举例子证明这些观点。不同的人在不同的年龄段对书中观点的理解会不一样,因为观点的理解和自己的经历有关,经历和观点产生共鸣才能有所收获。所以我并没有把书中全部的观点总结出来,而是结合自己的经历来做一次分享。

人生学会做减法

生有涯,知无涯。如果做得事情不对,就算提高了效率也是徒劳,事情多效率也很难提升,所以人生要学会做减法,要学会少做事,甚至不做事,意思是自己要能识别重点做哪些事,哪些事可以不做,这些事不做天不会塌下来。因为如果把时间集中起来将事情做的比别人好,会带来十倍的收益。比如你在学习架构,可以花一个月的时间来系统化学习写一篇长篇文章,价值一定远大于你一晚上写出来的短文。人在工作中容易捡芝麻丢西瓜,喜欢做简单的事情,真正有创造性的工作做不来,捡几百个芝麻不如一个西瓜。我们需要能够跳出思维定式,换一个角度来判断一件事情的重要性,需要舍弃很多利益。能力晋升一个台阶,职责影响力增加一个数量级。大家可以思考下自己在工作中哪些是在捡芝麻,哪些是在做西瓜。

阅读全文

分布式事务- TCC编程式模式

一、前言

严格遵守ACID的分布式事务我们称为刚性事务,而遵循BASE理论(基本可用:在故障出现时保证核心功能可用,软状态:允许中间状态出现,最终一致性:不要求分布式事务打成中时间点数据都是一致性的,但是保证达到某个时间点后,数据就处于了一致性了)的事务我们称为柔性事务,其中TCC编程模式就属于柔性事务,本文我们来阐述其理论。 阅读全文

《Python3.6官方文档》– 第一章

1. 开胃小菜

如果你有许多在电脑上的工作要做,并发现其中的任务一些是可以自动化的。 例如,你可能希望执行一个能够搜索并替换大量的文本文件程序,或者是有需要以一种复杂的方式去重命名和重新排列一堆照片文件。 又或许你想写一个小的自定义数据库或专门的GUI应用程序,或简单的游戏。

如果你是一个专业的软件开发人员,你可能需要开发一个引入数个C / C ++ / Java库的程序,但发现常规的写/编译/测试/重新编译的开发方式太慢了。 也许你正在为这样一个库编写一个测试套件并发觉为它编写测试代码是一项乏味的任务。 或者,你希望使用一种可扩展的语言写一个程序,但是你并不想设计和实现一个全新的语言。

那么,Python就是为你量身定制的。

阅读全文

分布式事务- 三阶段协议

一、前言

前面我们介绍了为解决分布式事务而提出来的的二阶段协议,本文首先来讲解二阶段的不足,然后阐述三阶段协议,三阶段协议也是一个标准的协议,也并没有说具体如何实现。 阅读全文

分布式事务- 二阶段协议

一、前言

在单个数据库实例时候,我们可以在一个数据源的事务(本地事务)内做多步数据库操作,在事务内的多个操作要么全部执行生效,要么全部不生效。在多数据实例节点时候,我们对多个实例的数据源进行操作时候就没办法把多个操作放到一个大的事务内来保证原子性了,因为多个实例操作的是不同的数据源,而数据库自带的事务是针对单个数据源来说的。 阅读全文

Guava 源码分析之Cache的实现原理

前言

Google 出的 Guava 是 Java 核心增强的库,应用非常广泛。

我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。

缓存

本次主要讨论缓存。缓存在日常开发中举足轻重,如果你的应用对某类数据有着较高的读取频次,并且改动较小时那就非常适合利用缓存来提高性能。

缓存之所以可以提高性能是因为它的读取效率很高,就像是 CPU 的 L1、L2、L3 缓存一样,级别越高相应的读取速度也会越快。

但也不是什么好处都占,读取速度快了但是它的内存更小资源更宝贵,所以我们应当缓存真正需要的数据。其实也就是典型的空间换时间。下面谈谈 Java 中所用到的缓存。

阅读全文

Java 使用 happen-before 规则实现共享变量的同步操作

前言

熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen-before(简称 hb)规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结果的影响。按照官方的说法:

当一个变量被多个线程读取并且至少被一个线程写入时,如果读操作和写操作没有 HB 关系,则会产生数据竞争问题。 要想保证操作 B 的线程看到操作 A 的结果(无论 A 和 B 是否在一个线程),那么在 A 和 B 之间必须满足 HB 原则,如果没有,将有可能导致重排序。 当缺少 HB 关系时,就可能出现重排序问题。

阅读全文

Java NIO AsynchronousFileChannel

原文链接 , 原文作者:Jakob Jenkov,  翻译:Neil Hao

在Java 7,AsynchronousFileChannel 被添加到了Java NIO中。使用AsynchronousFileChannel可以实现异步地读取和写入文件数据。
阅读全文

《Python3.6官方文档》– 六月翻译邀请

原文链接       邀请者:小村长

 

概述

本篇是 Python官方文档的的翻译邀请函。只从AlphaGo成功挑战世界围棋冠军之后,在软件工程界掀起了一股人工智能热。而Python凭借着大量丰富的机器学习库迎来了人生的第二春,从此Python与机器学习人工智能接下了不解之缘。并发编程网在此也借助广大的技术爱好者们,希望给大家带来更高质量的Python技术文档。本次翻译希望大家积极参加为技术推广做一份小小的贡献,在此村长向所有参入开源热衷于技术推广的有志之士表示深深的谢意,在端午节来临之际,提前祝愿大家磕家欢乐,幸福健康一万年。

 

如何领取

通过评论领取想要翻译的文章,每次领取一章或一节(根据内容长短),翻译完后再领取其他章节。领取完成之后,译文最好在一个星期内翻译完成,如果不能完成翻译,也欢迎你邀请其他同学和你一起完成翻译。请谨慎领取,很多文章领取了没有翻译,导致文章很长时间没人翻译。

如何提交

翻译完成之后请登录到并发网提交成待审核状态,会有专门的编辑校对后进行发布。如果多篇文章翻译被评为A级会升级您为译者,并加入译者沟通微信群。如果在本站翻译超过十篇文章,将有礼品赠送,比如签名版的《Java并发编程的艺术》或者荣誉译者奖杯等。如果你喜欢使用markdown编写文章,可以将markdown生成后的HTML复制到网站上进行提交,mac下推荐使用MacDown软件。

 
阅读全文

解读Raft(四 成员变更)

将成员变更纳入到算法中是Raft易于应用到实践中的关键,相对于Paxos,它给出了明确的变更过程(实践的基础,任何现实的系统中都会遇到因为硬件故障等原因引起的节点变更的操作)。

显然,我们可以通过shutdown集群,然后变更配置后重启集群的方式达到成员变更的目的。但是这种操作会损失系统的可用性,同时会带来操作失误引起的风险。支持自动化配置,即配置可以在集群运行期间进行动态的变更(不影响可用性)显示是一个非常重要的特性。

阅读全文

使用数据库悲观锁实现不可重入的分布式锁

一、前言

在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就无能无力了,这时候就需要分布式锁了。常见的有使用zk的最小版本,redis的set函数,数据库锁来实现,本节我们谈谈使用数据库悲观锁机制来实现一个分布式锁。 阅读全文

解读Raft(三 安全性)

前言

之前的两篇文章更多的是在描述Raft算法的正常流程,没有过多的去讨论异常场景。

而实际在分布式系统中,我们更多的都是在应对网络不可用、机器故障等异常场景,所以本篇来讨论一下Raft协议的安全性,即在异常场景下是否会导致数据丢失、数据不一致等情况。

阅读全文

解读Raft(二 选举和日志复制)

Leader election

Raft采用心跳机制来触发Leader选举。Leader周期性的发送心跳(如果有正常的RPC的请求情况下可以不发心跳)包保持自己Leader的角色(避免集群中其他节点认为没有Leader而开始选举)。

Follower在收到Leader或者Candidate的RPC请求的情况下一直保持Follower状态。而当一段时间内(election timeout)没有收到请求则认为没有Leader节点而出发选举流程。

阅读全文

使用zookeeper序列节点实现不可重入分布式锁

一、前言

在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就无能无力了,这时候就需要分布式锁了。常见的有使用zk的最小版本,redis的set函数,数据库锁来实现,本节我们谈谈使用zookeeper的序列节点机制来实现一个分布式锁。 阅读全文

解读Raft协议(一 算法基础)

什么是RAFT

分布式系统除了提升整个体统的性能外还有一个重要特征就是提高系统的可靠性。

提供可靠性可以理解为系统中一台或多台的机器故障不会使系统不可用(或者丢失数据)。

保证系统可靠性的关键就是多副本(即数据需要有备份),一旦有多副本,那么久面临多副本之间的一致性问题。

一致性算法正是用于解决分布式环境下多副本之间数据一致性的问题的。

阅读全文

return top