`
trydofor
  • 浏览: 145572 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

多线程情况下的一点差异

阅读更多
以下代码,没实际意义。
注意以下情况的不同点。
1)volatile 和 Atomic*
* private volatile long             unusedAmount = 0;
* private final AtomicLong          unusedAmount = new AtomicLong();
* private long                      unusedAmount  = 0;
2)作用域及异常
* nextA1()
* nextA2()
* nextB1()
* nextB2()


import java.util.LinkedList;
import java.util.Random;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author : Shi Rongjiu (www.trydofor.com)
 */
public class ThinkingInSync {
    
    private final ReadWriteLock       rwLock       = new ReentrantReadWriteLock();
    private final Lock                rLock        = rwLock.readLock();
    private final Lock                wLock        = rwLock.writeLock();
    
    // sync
    private final LinkedList<Integer> readWriteBox = new LinkedList<Integer>();
    private volatile long             unusedAmount = 0;
    private volatile Integer          currentValue = null;
    
    //private final AtomicLong          unusedAmount = new AtomicLong(); // 1
    //private long                      unusedAmount  = 0; // 2
    
    //
    private final Random              random       = new Random();
    private final AtomicInteger       counter      = new AtomicInteger(0);
    
    public Integer nextA1() throws InterruptedException, TimeoutException {
        wLock.lock();
        try {
            if (readWriteBox.size() <= 0) {
                syncLoad();
                unusedAmount = readWriteBox.size();
            }
            currentValue = makeValue();
            unusedAmount--;
        }
        finally {
            wLock.unlock();
        }
        return currentValue;
    }
    
    public Integer nextA2() throws InterruptedException, TimeoutException {
        wLock.lock();
        try {
            if (readWriteBox.size() <= 0) {
                syncLoad();
                unusedAmount = readWriteBox.size();
            }
            currentValue = makeValue();
            unusedAmount--;
            return currentValue;
        }
        finally {
            wLock.unlock();
        }
    }
    
    public Integer nextB1() throws InterruptedException, TimeoutException {
        wLock.lock();
        try {
            if (readWriteBox.size() <= 0) {
                syncLoad();
                unusedAmount = readWriteBox.size();
            }
            unusedAmount--;
            currentValue = makeValue();
            return currentValue;
        }
        finally {
            wLock.unlock();
        }
    }
    
    public Integer nextB2() throws InterruptedException, TimeoutException {
        wLock.lock();
        Integer result = null;
        long varUnused = unusedAmount;
        try {
            if (readWriteBox.size() <= 0) {
                syncLoad();
                varUnused = readWriteBox.size();
            }
            result = makeValue();
            varUnused--;
        }
        finally {
            unusedAmount = varUnused;
            currentValue = result;
            wLock.unlock();
        }
        
        return result;
    }
    
    public Integer current() {
        rLock.lock();
        try {
            return currentValue;
        }
        finally {
            rLock.unlock();
        }
    }
    
    public long remains() {
        rLock.lock();
        try {
            return unusedAmount;
        }
        finally {
            rLock.unlock();
        }
    }
    
    //-------------------------------
    private Integer makeValue() throws InterruptedException, TimeoutException {
        randomEvent();
        return readWriteBox.isEmpty() ? null : readWriteBox.removeFirst();
    }
    
    private int syncLoad() throws InterruptedException, TimeoutException {
        int sleep = randomEvent();
        readWriteBox.add(counter.incrementAndGet());
        int count = 1;
        if (sleep % 2 == 0) {
            count++;
            readWriteBox.add(counter.incrementAndGet());
        }
        if (sleep % 3 == 0) {
            count++;
            readWriteBox.add(counter.incrementAndGet());
        }
        
        return count;
    }
    
    private int randomEvent() throws InterruptedException, TimeoutException {
        int sleep = random.nextInt();
        
        if (sleep > 10000) {
            Thread.sleep(5000);
            throw new TimeoutException();
        }
        else if (sleep < 100) {
            Thread.currentThread().interrupt();
            throw new InterruptedException();
        }
        else {
            Thread.sleep(sleep);
        }
        
        return sleep;
    }
}

分享到:
评论

相关推荐

    一个进程池的服务器程序

    if (write_pid() ) //避免同时有多个该程序在运行 return -1; if (pipe(fd1) ) { perror("pipe failed"); exit(-1); } if (s_pipe(fd2) ) { perror("pipe failed"); exit(-1); } int port = atoi(argv...

    Python高级用法(GIL锁,深拷贝,浅拷贝,私有属性,魔法属性,上下文管理器)

    GIL介绍GIL与LockGIL与多线程Python 直接赋值、浅拷贝、深拷贝私有属性魔法方法属性访问控制描述符对像构造自定义容器上下文管理对象的序列化运算符相关的魔术方法比较运算符一元运算符和函数算术运算符反算术运算符...

    易语言程序免安装版下载

    修改高级表格支持库,解决在鼠标按下和抬起之间收到时钟周期事件的情况下,无法收到“被单击”事件的BUG。 3. 修改扩展界面支持库三,解决单击卷帘菜单后导致日期框不能弹出下拉窗口的BUG。 4. 修改XP风格支持库...

    Tcl_TK编程权威指南pdf

    线程安全 高级正则表达式 新字符串命令 dde扩展模块 杂类 第53章 tcl/tk 8.2 trf补丁 更快的字符串操作 空数组名 浏览器插件的兼容性 第54章 tcl/tk 8.3 关于tcl的修改建议 关于tk的改动建议 第55章...

    同步:JSON到核心数据,然后返回。 Swift Core数据同步

    映射属性,映射关系,插入差异,删除和更新差异通常是在应用程序之间不变的任务。 考虑到这一点,我们面临着将其抽象到库中的挑战。 Sync使用Core Data模型的知识来推断JSON和Core Data之间的所有映射,一旦使用它...

    asp.net知识库

    .net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常 Ado.net 与NHibernate的关系? 动态创建数据库 SQL Server数据库安全规划全攻略 .net通用数据库访问组件SQL Artisan应用简介1 在Framework1.0下...

    C#微软培训资料

    &lt;&lt;page 1&gt;&gt; page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 ... 14.2 多 态 性 .159 ... 比尔....这一天 微软公司正式推出了其下一代...

    VC++6.0核心编程源码.rar

    但是,由于各国对Windows操作系统提供了越来越多的支持,因此就更加容易为国际市场生产各种应用软件,从而缩短了软件的美国版本与国际版本推出的时间间隔。 Windows操作系统始终不逾地提供各种支持,以帮助软件开发...

    基于J2EE框架的个人博客系统项目毕业设计论...

    Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...

    达内 coreJava 习题答案

    i++){ //运行老久,减少循环次数会快很多,只是精确度小些 pi += (fenZi/fenMu) ; fenZi *= -1.0; //每项分子的变化是+4,-4,+4,-4 .... fenMu += 2.0; //分母的变化是1,3,5,7, .... 每项递加2 } ...

Global site tag (gtag.js) - Google Analytics