public class J_Test implements Runnable
{
int m_x,m_y;
public void mb_setX(int i)
{
m_x=i;
}
public void mb_setY(int i)
{
m_y=i;
}
public synchronized void mb_setXY(int i)
{
mb_setX(i);
mb_setY(i);
}
public void run()
{
for(int i=0; i>=0;i++)
{
mb_setXY(i);
if(m_x!=m_y) System.out.println(m_x+"!"+m_y);
}
}
public static void main(String args[])
{
J_Test s=new J_Test();
Thread t1=new Thread(s);
Thread t2=new Thread(s);
t1.start();t2.start();
}
}
请问各位:这道题的结果为何会输出一些带不等号的结果?synchronized void mb_setXY这个方法不是被加上锁了吗?
{
int m_x,m_y;
public void mb_setX(int i)
{
m_x=i;
}
public void mb_setY(int i)
{
m_y=i;
}
public synchronized void mb_setXY(int i)
{
mb_setX(i);
mb_setY(i);
}
public void run()
{
for(int i=0; i>=0;i++)
{
mb_setXY(i);
if(m_x!=m_y) System.out.println(m_x+"!"+m_y);
}
}
public static void main(String args[])
{
J_Test s=new J_Test();
Thread t1=new Thread(s);
Thread t2=new Thread(s);
t1.start();t2.start();
}
}
请问各位:这道题的结果为何会输出一些带不等号的结果?synchronized void mb_setXY这个方法不是被加上锁了吗?
synchronized void mb_setXY这个方法确实是被加锁了,所以里面的数据会被保护。但是输出顺序会打乱,因为可能t1线程执行一定时间片后,mb_setXY方法被t2线程抢去执行,待t2执行一定时间片后该方法又可能被t1抢走。但是里面的数据还是安全的。
你可以在你的if语句后再加else
{
System.out.println(this.m_x + "=" + this.m_y);
}测试。
你给的代码没有使用到synchronized的意义,你把它去掉结果是一样的
因为你启用的2个线程,他们自身的xy是独立的,绝对不会被另外一个影响到
出现!=的情况原因,是因为一个线程的mb_setXY()在执行的时候被另一个线程抢去了执行权,而导致自身的x,y的一次输出不同,实际还是相同的。
这个现象就直接说明,这里的方法mb_setXY在2个线程中都有独立的内存,synchronized不能起到作用其实,这个代码并没有给线程类传值,而且是用了for循环,for中的i很明显只在for循环中有效,怎么可能被其他的线程影响
{
public static int num=0;
public static void main(String[] args)
{
ThreadEX1 n = new ThreadEX1();
aaa x1=new aaa(n);
aaa x2=new aaa(n);
x1.start();
x2.start();
}
}class aaa extends Thread
{
public aaa(ThreadEX1 n){
this.n=n;
}
public ThreadEX1 n; public void run(){
while(n.num<=10){
synchronized(n){
System.out.println(Thread.currentThread().getName()+":"+n.num);
n.num++;
n.notify();
try{
Thread.sleep(500);
if(n.num<10){
n.wait();
}
}catch(Exception e){ }
}
}
}
}
因为你启用的2个线程,他们自身的xy是独立的,绝对不会被另外一个影响到
出现!=的情况原因,是因为一个线程的mb_setXY()在执行的时候被另一个线程抢去了执行权,而导致自身的x,y的一次输出不同,实际还是相同的。
这个现象就直接说明,这里的方法mb_setXY在2个线程中都有独立的内存,synchronized不能起到作用 其实,这个代码并没有给线程类传值,而且是用了for循环,for中的i很明显只在for循环中有效,怎么可能被其他的线程影响 ”你给我看的例程我能看明白你的意思,请你能再帮我把这句话讲的浅显些吗?我刚学JAVA,挺笨的,谢谢你啊