public class Test3 extends Thread{
static int i;
public static void main(String[] args) {
Thread a = new Test3();
Thread a2 = new Test3();
a.start();
a2.start();
}
@Override
public void run() {
try {
add();
} catch (Exception e) {
e.printStackTrace();
}
}
public void add() throws Exception
{
String kk = new String ();
synchronized (kk)
{
i++;
Thread.sleep(100);
System.out.println(Thread.currentThread().getId()+"__num:"+i);
}
}
}
为什么我加了锁.可打印的结果仍然是 i 都为2 呢?
请详细说明下原因.
我的想法是. 这个kk不是两个线程共有的.所以不能生效. 不知道对不对. :(
你的鎖用的不對啊.每次都new一個鎖,那能鎖住什麽,簡易先弄明白鎖的概念.
靜態變量需要的是類鎖
synchronized(Test3.class){
}
就是這樣也能鎖住啊:
synchronized(""){
}
楼主,你这个问题很简单,呵呵,因为你的add() 方法不是静态的static方法,你new了两个thread,因此他们是各自运行各自的方法,互补干扰,所以结果就是两个2啦,还有,既然add是同步方法,那么synchronized 方法就加到add上面呗,add方法的代码如下:[code="java"]
public static synchronized void add() throws Exception
{
i++;
Thread.sleep(100);
System.out.println(Thread.currentThread().getId()+"__num:"+i);
}
[/code]
这样楼主运行一下就OK了,呵呵
大体原因如楼上,不过建议synchronized 同步控制块,这样哪个地方需要同步就控制哪个,不必要整个方法都同步控制。
呵呵,楼主是用块同步变量来同步的,在项目中也应该根据实际需求来判断是该用哪种同步方式,应为各种同步方式优缺点不一样嘛,可以按照楼主的那种方式来同步啦,方便灵活,不过定义块同步变量的时候要小心了,最好将变量定义为private static final 类型的,防止变量被改变,同步失效哦。