<b>Java同步代码平等于断面</b>[Java编程]
本文“<b>Java同步代码平等于断面</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
同步常常作为断面被引用.断面是指一次只能有一个线程履行它.多个线程同时履行同步代码是有大概的.
这个曲解是因为很多程序员认为同步关键字锁住了它所包抄的代码.但是实际情形不是这样的.同步加锁的是对象,而不是代码.因此,假如你的类中有一个同步办法,这个办法可以被两个差别的线程同时履行,只要每个线程自己成立一个的该类的实例便可.
参考下面的代码:
class Foo extends Thread
{
private int val;
public Foo(int v)
{
val = v;
}
public synchronized void printVal(int v)
{
while(true)
System.out.println(v);
}
public void run()
{
printVal(val);
}
}
class SyncTest
{
public static void main(String args[])
{
Foo f1 = new Foo(1);
f1.start();
Foo f2 = new Foo(3);
f2.start();
}
}
运行SyncTest产生的输出是1和3穿插的.假如printVal是断面,你看到的输出只能是1大概只能是3而不能是二者同时呈现.程序运行的后果证明两个线程都在并发的履行printVal办法,即便该办法是同步的并且由于是一个无限循环而没有终止.
要实现真正的断面,你必须同步一个全局对象大概对类举行同步.下面的代码给出了一个这样的典范.
class Foo extends Thread
{
private int val;
public Foo(int v)
{
val = v;
}
public void printVal(int v)
{
synchronized(Foo.class) {
while(true)
System.out.println(v);
}
}
public void run()
{
printVal(val);
}
}
上面的类不再对个别的类实例同步而是对类举行同步.关于类Foo而言,它只有唯一的类定义,两个线程在相同的锁上同步,因此只有一个线程可以履行printVal办法.
这个代码也可以通过对大众对象加锁.比方给Foo增添一个静态成员.两个办法都可以同步这个对象而到达线程安全.
以上是“<b>Java同步代码平等于断面</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |