java线程共享受限资源 解决资源竞争 thinking in java4 21.3
java线程共享受限资源 解决资源竞争 具体介绍请參阅:thinking in java4 21.3
thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155
package org.rui.thread.res;
/**
* 不对的訪问 资源
* @author lenovo
*
*/
public abstract class IntGenerator { private volatile boolean canceled=false;//取消的
public abstract int next();
// 同意这样的被取消
public void cancel(){canceled =true;}
public boolean isCanceled(){return canceled;} }
package org.rui.thread.res; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 不论什么IntGenerator都能够用以下的EvenCherker类来測试
* @author lenovo
*
*/
public class EvenChecker implements Runnable { private IntGenerator generator;
private final int id; public EvenChecker(IntGenerator g,int ident)
{
this.generator=g;
this.id=ident;
} @Override
public void run() {
while(!generator.isCanceled())
{
int val=generator.next();
if(val%2!=0)
{
System.out.println(val+" not even!");
generator.cancel();//cancels all evencheckers
}
} } ///test any type of intgenerator
public static void test(IntGenerator gp,int count)
{
System.out.println("press control-c to exit");
ExecutorService ex=Executors.newCachedThreadPool();
for(int i=0;i<count;i++)
{
ex.execute(new EvenChecker(gp,i));
}
ex.shutdown(); /*for(int i=0;i<count;i++)
{
Thread t=new Thread(new EvenChecker(gp,i));
t.start();
}*/ } ///
public static void test(IntGenerator gp)
{
test(gp,10);
} }
package org.rui.thread.res;
/**
* 这个程序终于会失败,由于evenChecker任务在evenGenerator处于 不恰当的 状态时
* 仍可以訪问当中信息
* 假设你希望更快地发现失败。可以尝试着将yield() 的调用放置到第一个和第二个递增操作之间。
* 这仅仅是并发程序的部分部题
* @author lenovo
*
*/
public class EvenGenerator extends IntGenerator { private int currentEvenValue=0; @Override
public int next() {
++currentEvenValue;//危急项目》的出版物! danger point here
++currentEvenValue;
return currentEvenValue; } public static void main(String[] args) {
EvenChecker.test(new EvenGenerator());
} }
/**
* output:
press control-c to exit
13103419 not even!
*/
package org.rui.thread.res;
/**
* 同步控制 EvenGenerator
* @author lenovo
*
*/
public class SynchronizedEvenGenerator extends IntGenerator { private int currentEvenValue=0;
@Override
public synchronized int next() {
++currentEvenValue;
Thread.yield();//导致失败的更快 暂停当前正在运行的线程对象。并运行其它线程。 ++currentEvenValue;
return currentEvenValue;
} public static void main(String[] args) {
EvenChecker.test(new SynchronizedEvenGenerator());
}
}
/**
output:
press control-c to exit
*/
package org.rui.thread.res; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* 使用显示的Lock对象
* @author lenovo
*
*/
public class MutexEvenGenerator extends IntGenerator {
private int currentEvenValue=0; Lock lock=new ReentrantLock();
@Override
public int next() {
lock.lock();
try {
++currentEvenValue;
Thread.yield();//导致失败的更快 暂停当前正在运行的线程对象,并运行其它线程。 ++currentEvenValue;
return currentEvenValue;
} finally
{
lock.unlock();
}
}
//////////////////////////////
public static void main(String[] args)
{
EvenChecker.test(new MutexEvenGenerator()); } } /**
output:
press control-c to exit
*/
package org.rui.thread.res; import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock; /**
* synchronizedkeyword不能尝试着获取锁且终于获取锁会失败
* 或都尝试获取一段时间 。然后放弃它。要实现这些。你必须使用concurrent类库:
*
*
* ReentrantLock同意你尝试着获取但终于末获取锁,这样假设其它人已经获取了这个锁,
* 那么你就能够决定离开去运行其它一些事件。而不是等待直至这个锁被释放,就像在untimed()方法中所示。
* 在timed中 做出尝试去获取锁。该尝试能够在2秒之后失败
* @author lenovo
*
*/
public class AttemptLocking {
//可重入的相互排斥锁
private ReentrantLock lock=new ReentrantLock();
public void untimed()//不计时的
{
// 仅在调用时锁未被还有一个线程保持的情况下。才获取该锁。 boolean captured=lock.tryLock();
try
{
System.out.println("tryLock(): "+captured);
} finally
{
if(captured)
lock.unlock();
}
} /////////////
public void timed()//计时
{
boolean captured=false;
try {
//假设锁在给定等待时间内没有被还有一个线程保持,且当前线程未被中断,则获取该锁。
captured=lock.tryLock(2,TimeUnit.SECONDS);
} catch(InterruptedException e)
{
throw new RuntimeException(e);
} try
{
System.out.println("tryLock(2,TimeUnit.SECONDS) : "+captured);
} finally
{
if(captured)
lock.unlock();
}
}
///////////////main
public static void main(String[] args) throws InterruptedException {
final AttemptLocking al=new AttemptLocking();
al.untimed();//true -- lock is available 锁可用
al.timed();//true -- lock is available
//如今创建一个单独的任务获取锁 使以下的线程调用产生竞争
new Thread()
{
{setDaemon(true);}
@Override
public void run() {
al.lock.lock();
System.out.println("acquired");
}
}.start();
Thread.sleep(1000);
// 暂停当前正在运行的线程对象,并运行其它线程。 //Thread.yield();//give the 2nd task a chance 给第二个任务一个机会
al.untimed();//false--lock grabbed by task 锁了的任务
al.timed();//false--lock grabbed by task
} }
/**
* output:
tryLock(): true
tryLock(2,TimeUnit.SECONDS) : true
acquired
tryLock(): false
tryLock(2,TimeUnit.SECONDS) : false
*/
java线程共享受限资源 解决资源竞争 thinking in java4 21.3的更多相关文章
- paip.java 线程无限wait的解决
paip.java 线程无限wait的解决 jprofl>threads>thread dump> 查看棉线程执行的code stack... 估计是.比如.BlockingQue ...
- java线程安全问题原因及解决办法
1.为什么会出现线程安全问题 计算机系统资源分配的单位为进程,同一个进程中允许多个线程并发执行,并且多个线程会共享进程范围内的资源:例如内存地址.当多个线程并发访问同一个内存地址并且内存地址保存的值是 ...
- java线程初写,陆续更新中。。
(1)什么是线程?线程,是程序执行流的最小单元.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享 ...
- JAVA线程基础概念及使用
一.线程和进程的区别 在操作系统中所有运行的任务通常对应一个进程,进程是系统进行资源分配和调度的一个独立单位.线程是进程的组成部分,一个进程最少包含一个线程.并发和并行的区别是,并发指的在同一时刻内, ...
- Java线程池的那些事
熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...
- java线程不安全类与写法
线程不安全类 1.为什么java里要同时提供stringbuilder和stringbuffer两种字符串拼接类 2.simpledateformate是线程不安全的类,如果把它作为全局变量会有线程安 ...
- python中线程共享资源问题的解决
线程跟进程有些相似,有时被称作轻量级的进程,但不同的是,所有的线程运行在同一个进程中,共享相同的运行坏境. 进程和线程都是实现多任务的一种方式,例如:在同一台计算机上能同时运行多个QQ(进程),一个Q ...
- 【Linux 线程】同一个进程中的线程共享哪些资源
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线 ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
随机推荐
- Javascript 实现锚点(Anchor)间平滑跳转
(function($){ $.fn.scroller = function(options){ var defaultVal = { duration: }; var obj = $.extend( ...
- 菜鸟学Struts——I18N对国际化的支持
大家肯定都喜欢玩游戏吧. 对于是一个游戏迷的话,肯定玩过不少很棒的经典单机游戏.比方说,国产的<古墓丽影>.<刺客信条>.<鬼泣>国产的仙剑.古剑等.在众多游戏系列 ...
- UVA 1329 Corporative Network【并查集】
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
- php给图片加入文字水印
PHP对图片的操作用到GD库.这里我们介绍怎样给图片加入文字水印. 大致分为四步: 1.打开图片 2.操作图片 3.输出图片 4.销毁图片 以下我们上代码来详细解说每步的实现过程: <? php ...
- Extjs4.2 ajax请求url中传中文參数乱码问题
今天有个需求须要在url中传入中文參数.结果在后台取得时出现乱码,怀疑可能是编码问题.上网查询了资料,试了几种办法.发现有一种可行,记录在此,以便查阅. url中用encodeURI 进行2次编码: ...
- 使用Ant打包Android应用具体解释
计划写个完整的使用Ant打包Android应用的系列文章.三篇文章.首篇具体介绍採用Ant打包Android应用的流程.列出部分定制问题及其解决方法,第二篇介绍我理解的Ant打包的思路与主要的概念和使 ...
- 【React Native开发】React Native控件之ProgressBarAndroid进度条解说(12)
),React Native技术交流4群(458982758).请不要反复加群! 欢迎各位大牛,React Native技术爱好者增加交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文 ...
- apiCloud中openFrameGroup传参
apiCloud中openFrameGroup传参 1.无效的 api.openFrameGroup({ // 打开 frame 组 name: 'group', scrollEnabled: fal ...
- [jzoj 5930] [NOIP2018模拟10.26】山花 解题报告 (质因数分类)
题目链接: http://172.16.0.132/senior/#contest/show/2538/2 题目: 小S决定从某一个节点$u$开始对其子树中与$u$距离小于$K$的节点代表的花树进行采 ...
- JavaScript学习——使用JS完成全选和全不选操作
1.我们希望在后台系统实现一个批量删除的操作(全选所有的复选框)和全不选,显示效果如下: 2.步骤分析: 第一步:确定事件(onclick)并为其绑定一个函数(事件绑定到编号前面的复选框里面) 第二步 ...