破除java神话之四:同步代码等同于断面(critical section)
--------------------------------------------------------------------------------
http://Tech.acnow.net 2005-7-24 21:15:00 JR
2、
class Foo extends Thread
{
private String name;
private String val;
public Foo(String name,String v)
{
this.name=name;
val = v;
}
public void printVal()
{
synchronized(val) {
while(true) System.out.println(name+val);
}
}
public void run()
{
printVal();
}
}
public class SyncMethodTest
{
public static void main(String args[])
{
Foo f1 = new Foo("Foo 1:","printVal");
f1.start();
Foo f2 = new Foo("Foo 2:","printVal");
f2.start();
}
}
上面这个代码需要进行一些额外的说明,因为JVM有一种优化机制,因为String类型的对象是不可变的,因此当你使用""的形式引用字符串时,如果JVM发现内存已经有一个这样的对象,那么它就使用那个对象而不再生成一个新的String对象,这样是为了减小内存的使用。
上面的main方法其实等同于:
public static void main(String args[])
{
String value="printVal";
Foo f1 = new Foo("Foo 1:",value);
f1.start();
Foo f2 = new Foo("Foo 2:",value);
f2.start();
}
--------------------------------------------------------------------------------
http://Tech.acnow.net 2005-7-24 21:15:00 JR
2、
class Foo extends Thread
{
private String name;
private String val;
public Foo(String name,String v)
{
this.name=name;
val = v;
}
public void printVal()
{
synchronized(val) {
while(true) System.out.println(name+val);
}
}
public void run()
{
printVal();
}
}
public class SyncMethodTest
{
public static void main(String args[])
{
Foo f1 = new Foo("Foo 1:","printVal");
f1.start();
Foo f2 = new Foo("Foo 2:","printVal");
f2.start();
}
}
上面这个代码需要进行一些额外的说明,因为JVM有一种优化机制,因为String类型的对象是不可变的,因此当你使用""的形式引用字符串时,如果JVM发现内存已经有一个这样的对象,那么它就使用那个对象而不再生成一个新的String对象,这样是为了减小内存的使用。
上面的main方法其实等同于:
public static void main(String args[])
{
String value="printVal";
Foo f1 = new Foo("Foo 1:",value);
f1.start();
Foo f2 = new Foo("Foo 2:",value);
f2.start();
}