java线程共享受限资源 解决资源竞争  具体介绍请參阅:thinking in java4 21.3

thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155

  1. package org.rui.thread.res;
  2. /**
  3. * 不对的訪问 资源
  4. * @author lenovo
  5. *
  6. */
  7. public abstract class IntGenerator {
  8.  
  9. private volatile boolean canceled=false;//取消的
  10. public abstract int next();
  11. // 同意这样的被取消
  12. public void cancel(){canceled =true;}
  13. public boolean isCanceled(){return canceled;}
  14.  
  15. }
  1. package org.rui.thread.res;
  2.  
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. /**
  6. * 不论什么IntGenerator都能够用以下的EvenCherker类来測试
  7. * @author lenovo
  8. *
  9. */
  10. public class EvenChecker implements Runnable {
  11.  
  12. private IntGenerator generator;
  13. private final int id;
  14.  
  15. public EvenChecker(IntGenerator g,int ident)
  16. {
  17. this.generator=g;
  18. this.id=ident;
  19. }
  20.  
  21. @Override
  22. public void run() {
  23. while(!generator.isCanceled())
  24. {
  25. int val=generator.next();
  26. if(val%2!=0)
  27. {
  28. System.out.println(val+" not even!");
  29. generator.cancel();//cancels all evencheckers
  30. }
  31. }
  32.  
  33. }
  34.  
  35. ///test any type of intgenerator
  36. public static void test(IntGenerator gp,int count)
  37. {
  38. System.out.println("press control-c to exit");
  39. ExecutorService ex=Executors.newCachedThreadPool();
  40. for(int i=0;i<count;i++)
  41. {
  42. ex.execute(new EvenChecker(gp,i));
  43. }
  44. ex.shutdown();
  45.  
  46. /*for(int i=0;i<count;i++)
  47. {
  48. Thread t=new Thread(new EvenChecker(gp,i));
  49. t.start();
  50. }*/
  51.  
  52. }
  53.  
  54. ///
  55. public static void test(IntGenerator gp)
  56. {
  57. test(gp,10);
  58. }
  59.  
  60. }
  1. package org.rui.thread.res;
  2. /**
  3. * 这个程序终于会失败,由于evenChecker任务在evenGenerator处于 不恰当的 状态时
  4. * 仍可以訪问当中信息
  5. * 假设你希望更快地发现失败。可以尝试着将yield() 的调用放置到第一个和第二个递增操作之间。
  6. * 这仅仅是并发程序的部分部题
  7. * @author lenovo
  8. *
  9. */
  10. public class EvenGenerator extends IntGenerator {
  11.  
  12. private int currentEvenValue=0;
  13.  
  14. @Override
  15. public int next() {
  16. ++currentEvenValue;//危急项目》的出版物! danger point here
  17. ++currentEvenValue;
  18. return currentEvenValue;
  19.  
  20. }
  21.  
  22. public static void main(String[] args) {
  23. EvenChecker.test(new EvenGenerator());
  24. }
  25.  
  26. }
  27. /**
  28. * output:
  29. press control-c to exit
  30. 13103419 not even!
  31. */
  1. package org.rui.thread.res;
  2. /**
  3. * 同步控制 EvenGenerator
  4. * @author lenovo
  5. *
  6. */
  7. public class SynchronizedEvenGenerator extends IntGenerator {
  8.  
  9. private int currentEvenValue=0;
  10. @Override
  11. public synchronized int next() {
  12. ++currentEvenValue;
  13. Thread.yield();//导致失败的更快 暂停当前正在运行的线程对象。并运行其它线程。
  14.  
  15. ++currentEvenValue;
  16. return currentEvenValue;
  17. }
  18.  
  19. public static void main(String[] args) {
  20. EvenChecker.test(new SynchronizedEvenGenerator());
  21. }
  22. }
  23. /**
  24. output:
  25. press control-c to exit
  26. */
  1. package org.rui.thread.res;
  2.  
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;
  5.  
  6. /**
  7. * 使用显示的Lock对象
  8. * @author lenovo
  9. *
  10. */
  11. public class MutexEvenGenerator extends IntGenerator {
  12. private int currentEvenValue=0;
  13.  
  14. Lock lock=new ReentrantLock();
  15. @Override
  16. public int next() {
  17. lock.lock();
  18. try {
  19. ++currentEvenValue;
  20. Thread.yield();//导致失败的更快 暂停当前正在运行的线程对象,并运行其它线程。
  21.  
  22. ++currentEvenValue;
  23. return currentEvenValue;
  24. } finally
  25. {
  26. lock.unlock();
  27. }
  28. }
  29. //////////////////////////////
  30. public static void main(String[] args)
  31. {
  32. EvenChecker.test(new MutexEvenGenerator());
  33.  
  34. }
  35.  
  36. }
  37.  
  38. /**
  39. output:
  40. press control-c to exit
  41. */
  1. package org.rui.thread.res;
  2.  
  3. import java.util.concurrent.TimeUnit;
  4. import java.util.concurrent.locks.ReentrantLock;
  5.  
  6. /**
  7. * synchronizedkeyword不能尝试着获取锁且终于获取锁会失败
  8. * 或都尝试获取一段时间 。然后放弃它。要实现这些。你必须使用concurrent类库:
  9. *
  10. *
  11. * ReentrantLock同意你尝试着获取但终于末获取锁,这样假设其它人已经获取了这个锁,
  12. * 那么你就能够决定离开去运行其它一些事件。而不是等待直至这个锁被释放,就像在untimed()方法中所示。
  13. * 在timed中 做出尝试去获取锁。该尝试能够在2秒之后失败
  14. * @author lenovo
  15. *
  16. */
  17. public class AttemptLocking {
  18. //可重入的相互排斥锁
  19. private ReentrantLock lock=new ReentrantLock();
  20. public void untimed()//不计时的
  21. {
  22. // 仅在调用时锁未被还有一个线程保持的情况下。才获取该锁。
  23.  
  24. boolean captured=lock.tryLock();
  25. try
  26. {
  27. System.out.println("tryLock(): "+captured);
  28. } finally
  29. {
  30. if(captured)
  31. lock.unlock();
  32. }
  33. }
  34.  
  35. /////////////
  36. public void timed()//计时
  37. {
  38. boolean captured=false;
  39. try {
  40. //假设锁在给定等待时间内没有被还有一个线程保持,且当前线程未被中断,则获取该锁。
  41. captured=lock.tryLock(2,TimeUnit.SECONDS);
  42. } catch(InterruptedException e)
  43. {
  44. throw new RuntimeException(e);
  45. }
  46.  
  47. try
  48. {
  49. System.out.println("tryLock(2,TimeUnit.SECONDS) : "+captured);
  50. } finally
  51. {
  52. if(captured)
  53. lock.unlock();
  54. }
  55. }
  56. ///////////////main
  57. public static void main(String[] args) throws InterruptedException {
  58. final AttemptLocking al=new AttemptLocking();
  59. al.untimed();//true -- lock is available 锁可用
  60. al.timed();//true -- lock is available
  61. //如今创建一个单独的任务获取锁 使以下的线程调用产生竞争
  62. new Thread()
  63. {
  64. {setDaemon(true);}
  65. @Override
  66. public void run() {
  67. al.lock.lock();
  68. System.out.println("acquired");
  69. }
  70. }.start();
  71. Thread.sleep(1000);
  72. // 暂停当前正在运行的线程对象,并运行其它线程。
  73.  
  74. //Thread.yield();//give the 2nd task a chance 给第二个任务一个机会
  75. al.untimed();//false--lock grabbed by task 锁了的任务
  76. al.timed();//false--lock grabbed by task
  77. }
  78.  
  79. }
  80. /**
  81. * output:
  82. tryLock(): true
  83. tryLock(2,TimeUnit.SECONDS) : true
  84. acquired
  85. tryLock(): false
  86. tryLock(2,TimeUnit.SECONDS) : false
  87. */

java线程共享受限资源 解决资源竞争 thinking in java4 21.3的更多相关文章

  1. paip.java 线程无限wait的解决

    paip.java  线程无限wait的解决 jprofl>threads>thread dump> 查看棉线程执行的code stack... 估计是.比如.BlockingQue ...

  2. java线程安全问题原因及解决办法

    1.为什么会出现线程安全问题 计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址.当多个线程并发访问同一个内存地址并且内存地址保存的值是 ...

  3. java线程初写,陆续更新中。。

    (1)什么是线程?线程,是程序执行流的最小单元.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享 ...

  4. JAVA线程基础概念及使用

    一.线程和进程的区别 在操作系统中所有运行的任务通常对应一个进程,进程是系统进行资源分配和调度的一个独立单位.线程是进程的组成部分,一个进程最少包含一个线程.并发和并行的区别是,并发指的在同一时刻内, ...

  5. Java线程池的那些事

    熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...

  6. java线程不安全类与写法

    线程不安全类 1.为什么java里要同时提供stringbuilder和stringbuffer两种字符串拼接类 2.simpledateformate是线程不安全的类,如果把它作为全局变量会有线程安 ...

  7. python中线程共享资源问题的解决

    线程跟进程有些相似,有时被称作轻量级的进程,但不同的是,所有的线程运行在同一个进程中,共享相同的运行坏境. 进程和线程都是实现多任务的一种方式,例如:在同一台计算机上能同时运行多个QQ(进程),一个Q ...

  8. 【Linux 线程】同一个进程中的线程共享哪些资源

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线 ...

  9. Java线程基础知识(状态、共享与协作)

    1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...

随机推荐

  1. 20130910.Windows上安装和配置MongoDB

    官方文档:http://docs.mongodb.org/manual/tutorial/ 1.下载软件 http://www.mongodb.org/downloads 2.解压 解压后进入bin目 ...

  2. 在Html5中与服务器交互

    转自原文 在Html5中与服务器交互 刚刚涉足职场,上头就要我研究HTML5,内嵌到手机上,这对我来说完全是一个陌生的领域,不过也正好给自己一个机会来学习,最近做到要跟服务器交互这部分,这部分可是卡了 ...

  3. Android自己定义百度地图缩放图标

    自己定义实现Android百度地图的缩放图标,须要自己定义一个缩放控件,实现效果例如以下: 这里的缩放效果,实现了点击button能够对地图的放大缩小,通过手势放大与缩小也控制缩放图标的可用状态.详细 ...

  4. sql学习笔记(18)-----------数据库创建过程

    手动创建数据库的步骤:   第一步:决定数据库实例的SID 数据库实例的SID用来将当前实例和以后可能创建的实例进行区分 % setenv ORACLE_SID mynewdb     第二步:建立数 ...

  5. POJ 1721

    好像不需要用到开方什么的... 可以知道,一副牌即是一个循环,那么,由于GCD(L,K)=1,所以一次洗牌后,亦是一个循环.其实,K次洗牌等于是T^(2^K)了.既然是循环,必定有周期.那么,周期是多 ...

  6. 深入理解Dalvik虚拟机- 解释器的执行机制

    Dalvik的指令运行是解释器+JIT的方式,解释器就是虚拟机来对Javac编译出来的字节码,做译码.运行,而不是转化成CPU的指令集.由CPU来做译码,运行.可想而知.解释器的效率是相对较低的,所以 ...

  7. 王立平--EditText实现单行显示,左側图标,提示信息

    <EditText            android:layout_width="200dp"           android:layout_height=" ...

  8. android的架构图

    1.Applications 该层是Android应用程序层. 每一个应用必须利用android系统设计的应用框架(application framework)开发. 眼下的开发环境是eclipse ...

  9. PE文件结构(三) 输入表

    PE文件结构(三) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 输入表 输入函数,表示被程序调用可是它的代码不在程序代码中的,而在dll中的函数.对于这些函数.磁盘上的可执行文 ...

  10. sql系列(基础篇)-第一章 关于sysdate

    第一章 主要的SQL语句  1. 查询数据库系统时间,常以server默认的格式进行显示(依据数据库的字符集而定): 注意:dual 为数据库中的虚表,隶属于管理员 sys 用户,但全部的用户都能够訪 ...