日期:2014-05-20  浏览次数:20664 次

初学多线程,这段代码为什么没有实现方法同步问题?请大侠指教!
public class PlusThread extends Thread{
private static int j;
public synchronized void Plus(){
j++;
System.out.println(Thread.currentThread().getName() + "-inc:" + j);  

public void run(){
int n=0;
while(n<=100){
Plus();
n++;
}
}
public static void main(String[] args){
PlusThread.j = 0;
PlusThread thread1 = new PlusThread();
PlusThread thread2 = new PlusThread();
thread1.start();
thread2.start();
}
}
这段代码经过调试,thread1和thread2之间没有实现j++同步;为什么,错在哪里呢?请大侠赐教!
线程?方法同步? synchronized 线程 方法同步

------解决方案--------------------
首先哥们儿,熬夜不好。。。。。。
对于这个,你用了synchronized来实现同步,而如果你这样用,它的锁就是方法所在对象本身,你new出来了两个PlusThread,这是两个线程,分别调用他们自己内部的Plus()方法,那么两个线程所使用的锁不一样,所以不能实现同步啊,只有两个锁对象是同一个对象那才能达到同步。比如像我下面写的就能同步:
package com.test;

public class PlusThread extends Thread {
private static int j;

public static synchronized void Plus() {
j++;
System.out.println(Thread.currentThread().getName() + "-inc:" + j);
}

public void run() {
int n = 0;
while (n <= 100) {
Plus();
n++;
}
}

public static void main(String[] args) {
PlusThread.j = 0;
PlusThread thread1 = new PlusThread();
PlusThread thread2 = new PlusThread();
thread1.start();
thread2.start();
}
}

加上static后,这个方法就属于PlusThread类,而不是他的对象,也就是两个线程用的锁是PlusThread对应的类对象,而类对象只有一个啊,所以他们的锁是同一个,则能达到同步的效果。其实你你如果用synchronized 块来写的话,真接在类中定义一个静态成员对象,任意对象都行。。。。说白了想实现同步,就让各线程用的锁是同一个锁。。。。。。