本文主要是介绍共享受限资源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
你可以把单线程程序当作在问题域求解的单一实体,每次只能做一件事情。因为只有一个
实体,所以你永远不用担心诸如“两个实体试图同时使用同一个资源”这样的问题,比如:
两个人在同一个地方停车,两个人同时走过一扇门,甚至是两个人同时说话。
在多线程的环境中,可以同时做多件事情。但是,“两个或多个线程同时使用同一个受限资
源”的问题也出现了。必须防止这种资源访问的冲突,否则,就可能发生两个线程同时试图
访问同一个银行帐户,向同一个打印机打印,改变同一个值等诸如此类的问题。
不正确地访问资源
考虑下面的例子,这里的类“保证”当你调用getValue( )方法时,总能返回一个偶数。同
时,另外一个名为“Watcher”的线程不断调用getValue( )方法并检查返回值是否真的
为偶数。这看起来好像没什么意义,因为从代码上看,返回值显然是偶数。但这恰恰是令
人惊奇之处。下面是该程序的第一个版本:
//: c13:AlwaysEven.java
// Demonstrating thread collision overresources by
// reading an object in an unstableintermediate
state.
public class AlwaysEven {
private int i;
public void next() { i++; i++; }
public int getValue() { return i; }
public static void main(String[] args) {
final AlwaysEven ae = new AlwaysEven();
newThread("Watcher") {
public void run() {
while(true){
intval = ae.getValue();
if(val% 2 != 0) {
System.out.println(val);
System.exit(0);
}
}
}
}.start();
while(true)
ae.next();
}
} ///:~
在main( )中,建立了一个AlwaysEven对象,它必须是final的,因为它要被一个继承
自Thread的匿名内部类所访问。如果线程读出的值不是偶数,它将把这个值打印出来(以
证明它捕获了对象的不稳定状态)并退出程序。
这个例子表明了使用线程会遇到的基本问题。你永远不会知道线程是何时运行的。想象一
下,你坐在座子旁边,手里有一把叉子,准备叉起盘子里最后一块食物,当叉子碰到食物
的时候,它忽然消失了(因为你的线程被挂起,另一个线程跑进来偷走了食物)。这就是
你在写并发程序时要面临的问题。
你试图使用一个资源的同时,有时并不关心它是否正在被访问(比如别的盘子里的食物)。
但为了让多线程能工作,你就需要某种方法来防止两个线程访问同一个资源,至少是在某
个关键时间段内避免此问题。
要防止这类冲突,只要在线程使用资源的时候给它加一把锁就行了。访问资源的第一个线
程给资源加锁,接着其它线程就只能等到锁被解除以后才能访问资源,这时某个线程就可
以对资源加锁以进行访问。如果把汽车的前排座椅看成是受限资源的话,那么你的小孩大
喊一声“我要坐”,就相当于在声明上锁。
这篇关于共享受限资源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!