`
coolxing
  • 浏览: 869941 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
9a45b66b-c585-3a35-8680-2e466b75e3f8
Java Concurre...
浏览量:95914
社区版块
存档分类
最新评论
文章列表
[转载请注明作者和原文链接,  如有谬误, 欢迎在评论中指正. ]    场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问.本文将介绍如何利用zookeeper实现分布式锁. 思路 进程需要访问共享数据时, 就在"/locks"节点下创建一个sequence类型的子节点, 称为thisPath. 当thisPath在所有子节点中最小时, 说明该进程获得了锁. 进程获得锁之后, 就可以访问共享资源了. 访问完成后, 需要将 ...
[转载请注明作者和原文链接,  如有谬误, 欢迎在评论中指正. ]  通过之前的3篇博文, 讲述了ZooKeeper的基础知识点. 可以看出, ZooKeeper提供的核心功能是非常简单, 且易于学习的. 可能会给人留下ZooKeeper并不强大的印象, 事实并非如此, 基于ZooKeeper的核心功能, 我们可以扩展出很多非常有意思的应用. 接下来的几篇博文, 将陆续介绍ZooKeeper的典型应用场景. 场景描述 在分布式应用中, 我们经常同时启动多个server, 调用方(client)选择其中之一发起请求.分布式应用必须考虑高可用性和可扩展性: server的应用进程可能会崩溃 ...
[转载请注明作者和原文链接,  如有谬误, 欢迎在评论中指正. ]  ZooKeeper提供了Java和C的binding. 本文关注Java相关的API. 准备工作 拷贝ZooKeeper安装目录下的zookeeper.x.x.x.jar文件到项目的classpath路径下. 创建连接和回调接口 首先需 ...
[转载请注明作者和原文链接,  如有谬误, 欢迎在评论中指正. ]  ZooKeeper的数据结构, 与普通的文件系统极为类似. 见下图: 图片引用自developerworks 图中的每个节点称为一个znode. 每个znode由3部分组成: stat. 此为状态信息, 描述该znode的版本, 权限等信息. data. 与该znode关联的数据. children. 该znode下的子节点. ZooKeeper命令 在深入znode的各个部分之前, 首先需要熟悉一些常用的ZooKeeper命令. 连接server bin/zkCli.sh -server 1 ...
[转载请注明作者和原文链接,  如有谬误, 欢迎在评论中指正. ]  Zookeeper的安装和配置十分简单, 既可以配置成单机模式, 也可以配置成集群模式. 下面将分别进行介绍. 单机模式 点击这里下载zookeeper的安装包之后, 解压到合适 ...
有关golang的介绍请参考我的另一篇博文.     本文通过递归遍历src目录, 统计代码行数. 涉及到的知识点有: 1. 目录遍历. 2. 读取文件. 3. 使用channel进行goroutine间的通信. 4. 使用sync包进行传统的共享内存方式的同步. 5. 错误处理. 6. defer语句的使用.     在程序中有详细的注释:   // a simple go program for computing total line of souce files stored in one dir package main import ( &qu ...
假如你对golang感兴趣, 却尚未开始入门, 这篇文章就是为你准备的.     为什么要学习golang? 游说开发者尝试golang的文章很多. 比如golang主要设计者的演讲, 某个德国人的吐槽, 国内golang布道者所著书籍的前言. 我不想重复一 ...
[2012-05-21 翻译自这里, 对原文有所扩展, 也有所删减. 版权属于原作者, 转载必须保留此声明.] 在进入泛型的话题之前, 首先实现对int slice(可以看做int数组)的冒泡排序: func BubbleSort(array []int) { for i := 0; i < len(array); i++ { for j := 0; j < len(array)-i-1; j++ { if array[j] > array[j+1] { // 交换 ...
[2012-05-19 翻译自这里, 对原文有所扩展, 也有所删减. 版权属于原作者, 转载必须保留此声明.] go是函数式编程语言吗? 不是, 当然不是. 那么, go提供函数吗? 是的, 当然, 大多数编程语言都提供函数, go也不例外.  func SayHello() { fmt.Println("Hello") } go使用关键字func定义函数, 并在函数体中编写函数逻辑.  go函数可以接受参数吗? 额, 这个问题... 哦, 我懂了, 也许是我的SayHello函数给大家造成了错觉, 我会改造我的 ...
[转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ] 在java NIO中, 通道是IO传输发生时数据通过的入口, 而缓冲区是数据的来源或目标.  Buffer是java NIO中定义的所有缓冲区类的基类.   Buffer的属性 1. 容量(capacity) 缓冲区能够容纳的数据元素的最大数量, capacity在创建缓冲区时指定, 之后无法改变. 2. 上界(limit) 读模式下, limit表示能读取的最后一个字节; 写模式下, limit等于capacity. 3. 位置(position) position表示当前索引. 4. 标记(mark) m ...
[本文是我对Java Concurrency In Practice C14.1的归纳和总结.  转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ]  java类库中包含许多状态依赖的类: 其中的某些方法只有满足特定的前置条件才能继续, 比如BlockingQueue的take方法, 只有队列不为空时take方法才能返回. 状态依赖的操作一般如下: void blockingAction() { 申请锁 while(前置条件不满足) { 释放锁 重新获取锁 } 执行操作 释放锁 }   BaseBoundedBuffer是一个普通抽象类, ...
[本文是我对Java Concurrency In Practice C13的归纳和总结.  转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ] 任何java对象都可以用作同步的锁, 为了便于区分, 将其称为内置锁. JDK5.0引入了显式锁: Lock及其子类(如ReentrantLock, Re ...
[本文是我对Java Concurrency In Practice C11的归纳和总结.  转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ]  可扩展性和Amdahl's law--阿姆达尔定律 Scalability describes the ability to improve throughput or capacity when additional resources are added. When tuning for performance, the goal is usually to do the same work with less effort. ...
[本文是我对Java Concurrency In Practice C10的归纳和总结.  转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ] 如果多个线程以不同的顺序持有多个锁, 可能发生死锁:   public class AccountTrans { public void transferMoney(Account fromAccount, Account toAccount, DollarAmount amount) throws InsufficientFundsException { synchronized (fromAccount) { ...
[本文是我对Java Concurrency In Practice C08的归纳和总结.  转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ] task和线程池执行机制之间隐式的耦合 前面曾提到过, 线程池的应用解耦了task的提交和执行. 事实上, 这有所夸大, 因为不是所有的task都适用于所有的执行机制, 某些task要求在特定的线程池中执行: 1. 非独立task, 指的是依赖于其他task的任务.  2. 要求在单线程中运行的task. 某些task不是线程安全的, 无法并发运行. Executors.newSingleThreadExecutor()方法返回的线程 ...
Global site tag (gtag.js) - Google Analytics