学习《java多线程编程核心技术》遇到的一些问题

首先先贴出示例代码:

ThreadA:

public class ThreadA extends Thread {

	
	private MyList list;
	public ThreadA(MyList list) {
		super();
		this.list = list;
	}
	
	
	
	@Override
	public void run() {
		try {
			for (int i=0;i<10;i++) {
				list.add();
				System.out.println("添加了"+(i+1)+"个元素");
				Thread.sleep(1000);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	 

}

ThreadB:

public class ThreadB extends Thread {
	
	private MyList list;
	
	public ThreadB(MyList list) {
		super();
		this.list = list;
	}
	 
	
	
	@Override
	public void run() {
		try {
			while (true) {
				if(list.size()==5) {
					System.out.println("==5 了  线程 b 要退出了");
					throw new InterruptedException();
				}
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	

}

Test:

public class Test {

	public static void main(String[] args) {
		MyList service = new MyList();
		
		ThreadA a = new ThreadA(service);
		a.setName("A");
		a.start();
		
        ThreadB b = new ThreadB(service);
		b.setName("B");
		b.start();
		
		
	}

}

以上代码主要是用来演示sleep() 加 while(true) 实现线程间通讯的示例代码,书中给出的示例结果是这样的:

添加了1个元素
添加了2个元素
添加了3个元素
添加了4个元素
添加了5个元素
==5 了  theadB 要退出了
java.lang.InterruptedException
	at com.asiainfo.mcss.sm.thread.ThreadB.run(ThreadB.java:20)
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素

然而我的执行结果总是这样的:

添加了1个元素
添加了2个元素
添加了3个元素
添加了4个元素
添加了5个元素
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素

并且程序没有退出。这说明while(true)是执行的,但是符合进入list.size()==5的条件。

其实一开始我就认为示例代码是得不出示例的结果的,因为此书第二章节最后讲的是volatile关键字,说的是如何在变量线程间可见。theadA,threadB 中的list应该是线程私有栈中的变量,当时我就觉得声明MyList的时候要加volatile关键字才能得到示例结果,而且加了确实可以得到示例中的结果。但是我是个不太自信人,总觉的自己是不是哪里写错了,于是在while和if之间加了个sysout 打印看看list.size(),结果它居然进了if条件~~~我日~什么鬼,然后我有注释掉这行打印,它又没有进if条件。。。。

经过百般思过我想到了一个关键字synchronized 于是我点开System.out.Println()源码

/**
     * Prints a String and then terminate the line.  This method behaves as
     * though it invokes <code>{@link #print(String)}</code> and then
     * <code>{@link #println()}</code>.
     *
     * @param x  The <code>String</code> to be printed.
     */
    public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

同步关键字可以间接保证线程间变量可见性。

转载于:https://my.oschina.net/unteacher/blog/1793128

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值