关于Java Synchronized的使用

圣殿幽灵骑士 2014-06-12 04:43:30
代码输出的 i 值都为2,为什么没有锁住Timer类对象 t
class Timer{

private static int i=0;
public synchronized void add(int n)
{
//synchronized (this){
i++;
try{
Thread.sleep(1);
}catch(InterruptedException e){

}
System.out.println("线程" + n + "---" + i);
//}
}
}

public class SynchronizedThread extends Thread{

Timer t = new Timer();
int n;

SynchronizedThread(int n){
this.n = n;
}

@Override
public void run() {
t.add(n);
}

public static void main(String[] args) {

SynchronizedThread t1 = new SynchronizedThread(1);
SynchronizedThread t2 = new SynchronizedThread(2);
t1.start();
t2.start();

}

}
...全文
302 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
MageXellos 2014-06-14
  • 打赏
  • 举报
回复
直接把Timer t改为static Timer t就行了,不然你开一个线程重新new Timer对象,没法锁。
沉思的猿某人 2014-06-14
  • 打赏
  • 举报
回复
引用 3 楼 sunhui1234567890 的回复:
楼主这样写就可以了: SynchronizedThread synchronizedThread = new SynchronizedThread(1); Thread t1 = new Thread(synchronizedThread); Thread t2 = new Thread(synchronizedThread); t1.start(); t2.start();
正解
等风的云 2014-06-14
  • 打赏
  • 举报
回复
学习下, 是否把Timer的创建改成这样也可以呢?
static Timer t = new Timer();
科小宇 2014-06-14
  • 打赏
  • 举报
回复
锁的只是 实例对象 而不是class对象,如果锁的是static方法 就锁住了
草原的雨夜 2014-06-13
  • 打赏
  • 举报
回复
楼上正解。。。
平菇虾饺 2014-06-13
  • 打赏
  • 举报
回复
你锁n个都没事,你做了n个对象,互为单线程了
我爱小猴子 2014-06-13
  • 打赏
  • 举报
回复
楼主这样写就可以了: SynchronizedThread synchronizedThread = new SynchronizedThread(1); Thread t1 = new Thread(synchronizedThread); Thread t2 = new Thread(synchronizedThread); t1.start(); t2.start();
  • 打赏
  • 举报
回复
class Timer中的public synchronized void add(int n){}锁定当前的timer对象,而每一个SynchronizedThread实例都会new一个timer实例,所以锁定的不是同一对象.
冰魔鬼 2014-06-12
  • 打赏
  • 举报
回复
不是同一个对象

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧