public class XYX
{
public static void main(String[] args)
{
Thread a = new Thread(new MyThread());
Thread b = new Thread(new MyThread());
a.start();
b.start();
}
}class MyThread implements Runnable
{
static volatile private int X = 20;
private int y = 0;
public synchronized int XXX()
{
System.out.println("1");
int a = 10;
y = (int)(Math.random() * a);
try
{
X = X - y ;
Thread.sleep(10); X = X + y ;
Thread.sleep(10);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("2");
return X; }
public void run()
{
for(int i = 0 ; i <100 ; i++)
{
System.out.println(Thread.currentThread() + " X = " + XXX());
}
}
}
在方法的开头和结尾位置加了两条打印语句,怎么结果是这样的~?同步方法不是执行完后才会释放锁对象么~?难道sleep方法也会~?百思不得其解···
Thread[Thread-1,5,main] X = 20
2
Thread[Thread-0,5,main] X = 20
1
1
2
Thread[Thread-0,5,main] X = 20
2
Thread[Thread-1,5,main] X = 20
1
1
2
Thread[Thread-0,5,main] X = 12
1
2
Thread[Thread-1,5,main] X = 8
{
public static void main(String[] args)
{
Thread a = new Thread(new MyThread());
Thread b = new Thread(new MyThread());
a.start();
b.start();
}
}class MyThread implements Runnable
{
static volatile private int X = 20;
private int y = 0;
public synchronized int XXX()
{
System.out.println("1");
int a = 10;
y = (int)(Math.random() * a);
try
{
X = X - y ;
Thread.sleep(10); X = X + y ;
Thread.sleep(10);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("2");
return X; }
public void run()
{
for(int i = 0 ; i <100 ; i++)
{
System.out.println(Thread.currentThread() + " X = " + XXX());
}
}
}
在方法的开头和结尾位置加了两条打印语句,怎么结果是这样的~?同步方法不是执行完后才会释放锁对象么~?难道sleep方法也会~?百思不得其解···
Thread[Thread-1,5,main] X = 20
2
Thread[Thread-0,5,main] X = 20
1
1
2
Thread[Thread-0,5,main] X = 20
2
Thread[Thread-1,5,main] X = 20
1
1
2
Thread[Thread-0,5,main] X = 12
1
2
Thread[Thread-1,5,main] X = 8
{
public static void main(String[] args)
{
MyThread thread=new MyThread();
Thread a = new Thread(thread());
Thread b = new Thread(thread());
a.start();
b.start();
}
}
这样改下。