本帖最后由 我能学编程吗 于 2013-10-19 13:23 编辑
又研究了一下,迷底揭晓,对不起楼主,我最开始的理解是错误的,都打印1的原因确实是因为有1000个不同的sum对象了,通过下面代码能知道所有的sum对象不是同一个,因为如果是同一个的话,主线程中的sum也应该等于1才对。如下代码:- public class Demo {
- public static void main(String[] args) {
- Integer sum = 0;
- for (int i = 0; i < 5; i++) {
- new Thread(new Counter(sum)).start();
- }
- try { Thread.sleep(1000); } catch (Exception e) { } // 暂停1秒,让子线程先执行完,再执行主线程下面的代码
- System.out.println("主线程中的sum = " + sum);
- }
- }
- class Counter implements Runnable{
-
- public Integer sum;
-
- public Counter(Integer sum) {
- this.sum = sum;
- }
- @Override
- public void run() {
- sum++;
- System.out.println("子线程中的sum = " + sum);
- }
- }
- class MyInteger {
- public int i;
- public MyInteger(int i) {
- this.i = i;
- }
- }
复制代码 输出结果如下:
子线程中的sum = 1
子线程中的sum = 1
子线程中的sum = 1
子线程中的sum = 1
子线程中的sum = 1
主线程中的sum = 0
那为什么这1000个sum不是同一个对象呢?问题在这里,我把Integer对象换成MyInteger对象,其他什么都不改,结果这1000个sum又是同一个对象了,如下代码:- public class Demo {
- public static void main(String[] args) {
- MyInteger sum = new MyInteger(0);
- for (int i = 0; i < 5; i++) {
- new Thread(new Counter(sum)).start();
- }
- try { Thread.sleep(1000); } catch (Exception e) { } // 暂停1秒,让子线程先执行完,再执行主线程下面的代码
- System.out.println("主线程中的sum = " + sum.i);
- }
- }
- class Counter implements Runnable{
-
- public MyInteger sum;
-
- public Counter(MyInteger sum) {
- this.sum = sum;
- }
- @Override
- public void run() {
- sum.i++;
- System.out.println("子线程中的sum = " + sum.i);
- }
- }
- class MyInteger {
- public int i;
- public MyInteger(int i) {
- this.i = i;
- }
- }
复制代码 输出结果如下:
子线程中的sum = 1
子线程中的sum = 3
子线程中的sum = 2
子线程中的sum = 4
子线程中的sum = 5
主线程中的sum = 5
为什么传Integer就不是同一个对象,而传MyInteger就是同一个对象呢?这里我也不明白,希望有高手指点一下吧!我开始在6楼(地板)的结论说“同步代码只能同步同一个对象里的代码”,看了上面的实验,似乎“同步代码是可以同步多个对象里的代码”,如果这个结论成立,那为什么我6楼(地板)的代码中,明明是用同一个同步对象的啊,可为什么没有起到同步,因为6楼的打印结果是打印了两次1,这是为什么?
|