看书看到多线程的时候,书上讲到了线程同步的内容,然后是举了个例子,代码如下
class My implements Runnable{
private int count =0;
public void run(){
test();
}
private void test(){
for(int i=0;i<10;i++){
count++;
Thread.yield();
count--;
System.out.println(count);
}
}}
public class Test {
public static void main(String args[]) throws InterruptedException{
My t=new My();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
}}
书上给的例子是运行结果变得很奇怪,打印了很多-1,没什么规律,但是我自己测试时全都是0 ,- -。书上后面加了Synchronized关键字说是运行结果全为0,不知道这是为什么。
还有t1,t2不是两个对象么?他们的count为什么是共享的?
嫩鸟求救啊,谢谢了。
class My implements Runnable{
private int count =0;
public void run(){
test();
}
private void test(){
for(int i=0;i<10;i++){
count++;
Thread.yield();
count--;
System.out.println(count);
}
}}
public class Test {
public static void main(String args[]) throws InterruptedException{
My t=new My();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
}}
书上给的例子是运行结果变得很奇怪,打印了很多-1,没什么规律,但是我自己测试时全都是0 ,- -。书上后面加了Synchronized关键字说是运行结果全为0,不知道这是为什么。
还有t1,t2不是两个对象么?他们的count为什么是共享的?
嫩鸟求救啊,谢谢了。
解决方案 »
- 关于反射的一个小问题,不知道错误在哪。
- 同一个jdk安装文件(jdk-6u13-windows-i586-p.exe)先后在两台xp系统中安装,为何在安装目录中生成的文件夹不同?
- 想对LinkedHashSet 排序 应该用什么函数 Collections.sort为什么没用?
- 提示资源未找到,谁能解释一下下面这段代码
- 用java怎么做出类似Dreamweaver那种效果
- 一个端口能否让输入和输出同时进行?
- [转帖]今晚名师主讲:免费网络视频公开课《轻轻松松踏入Java殿堂》
- 谁能教教我用VJ++如何运行JAVA源文件(我是新手)
- 奇怪的问题,请进!!
- 难!难于上青天!记录几千万条,请问有什么好的分页办法,谢谢
- 今天面试问题
- java JDBC 的一点疑惑。
My t=new My();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
你没注意两个Thread其实共享了一个 My 对象么?
Thread t1=new Thread(t);
Thread t2=new Thread(t);
这里t是同一个My对象,也就是说两个线程走的是同一个代码,用的是同一个变量count.再说第一个问题,书上说打印好多-1?
虽然是多线程,两个线程可能同时访问test方法,但只要执行count--前肯定要先执行count++。
所以应该不会出现打印-1的情况,倒是可能出现打印1的情况,楼主看看是不是说错了。
你将循环次数修改大点,比如一千,就可以看到效果了。加synchronize的目的就是为了线程同步,两个线程不能同时访问test方法。避免出现打印有时0,有时1的情况。