class Single implements Runnable
{
private static Single s=null;
Single()
{
System.out.println("new Single()");
}
public void run()
{
if(s==null)
{
synchronized(Single.class)
{
//if(s==null)
s=new Single();
}
}
}
}
public class LazyMode {
public static void main(String[] args) {
Single t=new Single();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
}
}
如上代码,在synchronized代码块内将if(s==null)这句注释掉之后,结果有时打印两次new Single(),有时打印三次new Single(),请问这是为什么?作者: 党巾水 时间: 2012-7-16 14:17 本帖最后由 刘馨琪 于 2012-7-16 14:21 编辑
多线程问题。
没加那句话时,一个线程可能只new了对象而没有执行完后面代码就挂在那里等待,然后另一个线程进来了,又new了一个对象。一会儿之前的线程醒了,继续执行程序。就会多出一个。
加了那句话后,前一个线程new新对象后,后一个线程一检测发现又对象,就进不去了,就不会多出对象了。作者: 游兴钟 时间: 2012-7-16 14:30
首先,你这个代码不是懒汉式
下面就说说打印的情况
public void run()
{
if(s==null)
{//t1 t2----->如果两个线程都同时执行到这里的时候失去了执行权,等再次拿到执行权的没有回去判断S==null的条件,执行完同步代码块的代码就会再建两个对象,也就是打印三次"new Single()" 情况2:如果挂在这的线程只是t1或者t2中的其中一个 等拿回执行权的时候就会建立一个S对象 然后另外一个线程再一判断条件s!=null也就不会进这代码里面 这时候就是打印两次
synchronized(Single.class)
{//当然对应打印三次的情况一个挂在上面的位置其中一个线程挂在这里也是可能的 这没什么太大的区别
//if(s==null)
s=new Single();
}
}
}
public class LazyMode {
public static void main(String[] args) {
Single t=new Single();//这是一定会打印的第一次"new Single()"
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
}
} 作者: 游兴钟 时间: 2012-7-16 14:30
首先,你这个代码不是懒汉式
下面就说说打印的情况
public void run()
{
if(s==null)
{//t1 t2----->如果两个线程都同时执行到这里的时候失去了执行权,等再次拿到执行权的没有回去判断S==null的条件,执行完同步代码块的代码就会再建两个对象,也就是打印三次"new Single()" 情况2:如果挂在这的线程只是t1或者t2中的其中一个 等拿回执行权的时候就会建立一个S对象 然后另外一个线程再一判断条件s!=null也就不会进这代码里面 这时候就是打印两次
synchronized(Single.class)
{//当然对应打印三次的情况一个挂在上面的位置其中一个线程挂在这里也是可能的 这没什么太大的区别
//if(s==null)
s=new Single();
}
}
}
public class LazyMode {
public static void main(String[] args) {
Single t=new Single();//这是一定会打印的第一次"new Single()"
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
}
} 作者: 王飞 时间: 2012-7-16 14:35
class Single implements Runnable
{
private static Single s=null;
Single()
{
System.out.println("new Single()");
}
public void run()
{
if(s==null)
{
synchronized(Single.class)
{
//if(s==null)
s=new Single();
}
}
}
}
public class LazyMode {
public static void main(String[] args) {
Single t=new Single(); // 此时会首先执行一次Single类的构造函数,打印一个"new Single()";
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();此时你开启了了一个线程,加main就是2个线程,线程一开起;main就和t1这个线程抢资源,当t1抢到后就到run方法中,否则向下执行
t2.start();如果上面是main先抢到资源,运行玩这句话后便是3个线程,于是抢夺cpu的线程就变成了3个
当线程进到第一个if的时候如果另一个线程抢到了cpu,那么就停在了这里,下面synchronized(Single.class)就没有执行到,下一个线程进来到run方法中时,第一个线程呛到了cpu资源,此时就有一个new Single,执行完后,第二个线程如果进入到了if语句中,那么就有2哥new Single;如果没有尽到if中,那么此时就只有一个new Single