技术开发 频道

JAVA线程:如何解决资源共享冲突(下)

  【IT168技术】终于到了这个小系列的最后一篇了,写这个主题的博文感觉很奇特,虽然我尽全力去深入理解这些知识点所蕴含的深意,最终也感觉似乎懂了,但略微冷静下来后又感到自己的理解还是有点似是而非。我想原因还是在于自己知识面还不够宽阔,有些底层的计算机技术我并不熟悉,解决这些不熟悉的计算机技术就是我以后学习的目标之一。开始进入正题之前,我还是想再强调下,线程技术真的很重要,熟练掌握了线程技术一定能解决我们在编程时候碰到的各种难以解决的问题。

  相关阅读:

  JAVA线程:如何解决资源共享冲突(中)

  JAVA线程:如何解决资源共享冲突(上)

  上篇文章里最后我们写了一个SynchronizedEvenGenerator类:

package cn.com.sxia;

public class SynchronizedEvenGenerator implements Invariant {

private int i;
public synchronized void next(){
i++;
i++;
}
public synchronized int getValue(){
return i;
}

@Override
public InvariantState invariant() {
int val = getValue();
if (val % 2 == 0)
return new InvariantOK();
else
return new InvariantFailure(new Integer(val));
}
public static void main(String[] args) throws InterruptedException {
SynchronizedEvenGenerator gen = new SynchronizedEvenGenerator();
new InvariantWatcher(gen,4000);
while(true){
gen.next();
}
}

}

   前面我们还写了个EvenGenerator类:

package cn.com.sxia;

public class EvenGenerator implements Invariant {
private int i;
public void next(){
i++;
i++;
}
public int getValue(){
return i;
}

@Override
public InvariantState invariant() {
int val = i;
if (val % 2 == 0)
return new InvariantOK();
else
return new InvariantFailure(new Integer(val));
}
public static void main(String[] args){
EvenGenerator gen = new EvenGenerator();
new InvariantWatcher(gen);
while(true){
gen.next();
}
}

}

   两个类很相似,但还是有区别:

  SynchronizedEvenGenerator类里的getValue和next方法前都加上了Synchronized关键字。

  EvenGenerator类里invariant方法里有这样一个语句int val = i;而SynchronizedEvenGenerator里面对应的语句是int val = getValue();

  两个类运行的结果是:EvenGenerator会执行失败,原因就是线程不安全了,而SynchronizedEvenGenerator线程安全所以会一直正常运行。

0
相关文章