关于synchronized(this)的简单问题

winmenaruto 2009-12-13 07:49:27
public class A {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread1 td=new Thread1();
new Thread(td).start();
new Thread(td).start();
new Thread(td).start();

}

}

class Thread1 implements Runnable {
private int i=5;

@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(this){
if(i>0 && i!=0)
{
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" yunxin "+(i--)+" ci");
}
}



}

}








Thread-1 yunxin 5 ci
Thread-2 yunxin 4 ci
Thread-2 yunxin 3 ci
Thread-2 yunxin 2 ci
Thread-2 yunxin 1 ci

线程,每次出的结果都不同 这个正常,但是我感觉应该都是同一个线程的5,4,3,2,1,不应该有上面的结果
还有问下,private 的i,每个线程都是公用的i,当Thread-1做好了i=5之后,this的锁还是应该在Thread-1上面的,为什么紧接着Thread-2就能用了呢 ?此时锁不是应该在Thread-1上,只到它5次完成后,锁才能被释放 给其他线程用..
...全文
363 16 打赏 收藏 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
stream1990 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gao11811 的回复:]
举个例子
楼主你写的代码好比,有个mm,现在在你这里,然后你去草场跑一圈,回来后你用绳子绑住她,逼她亲你一下,然后解开绳子,你再去跑一圈
可是你去跑的时候绳子已经解开了,mm随时会走掉啊
你需要做的就是,在你跑圈(while)的时候,也绑住她,那就可以了
[/Quote]

这比喻。。。。。。
wuyongai0563 2009-12-17
  • 打赏
  • 举报
回复
楼主看来对线程还不是很熟悉啊
只要把你的 while(true){ synchronized(this){
改成 synchronized(this){ while(true){
就是楼主“但是我感觉应该都是同一个线程的5,4,3,2,1 ” 的效果了

gao11811 2009-12-17
  • 打赏
  • 举报
回复
举个例子
楼主你写的代码好比,有个mm,现在在你这里,然后你去草场跑一圈,回来后你用绳子绑住她,逼她亲你一下,然后解开绳子,你再去跑一圈
可是你去跑的时候绳子已经解开了,mm随时会走掉啊
你需要做的就是,在你跑圈(while)的时候,也绑住她,那就可以了
liujun3512159 2009-12-17
  • 打赏
  • 举报
回复
恩,7楼正解
tannel 2009-12-16
  • 打赏
  • 举报
回复
7楼说的对,是while要写synchronized(this)里面。
楼上的,sleep是阻塞,不释放锁。
API:
sleep
public static void sleep(long millis)throws InterruptedException
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权。
Mybeautiful 2009-12-14
  • 打赏
  • 举报
回复
当Thread-1做好了i=5之后,this的锁还是应该在Thread-1上面的,为什么紧接着Thread-2就能用了呢


线程sleep了,锁就释放了,其他都问题就都迎刃而解了吧?
leonis01 2009-12-13
  • 打赏
  • 举报
回复
只要不是static的就是单独使用的.
winmenaruto 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leonis01 的回复:]
引用 3 楼 zangxt 的回复:
synchronized(this)当前对象就是当前的Thread1对象。
new Thread(td).start();
new Thread(td).start();
new Thread(td).start();
3个Thread1对象,每个线程都在自己这个对象上加锁,互不影响。

可以通过参数传一个公共对象,或者使用唯一的对象,比如利用字符串的性质使用synchronized("abc"),
或者synchronized(Thread1.class)等等


它只有一个Thread1对象好伐.这个this是同一个对象.
问题的关键在于lz写的不对.synchronized(this)应该写在While外面.
LZ这样写在同步块完成到进入下一个循环前这段时间,其他线程可以抢占
[/Quote]
哎..我也这么觉得啊 同感!!

还有问下,一个类里面的成员变量,各个对象都是共用的么?是不是public的,就各个对象单独使用的?
leonis01 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zangxt 的回复:]
synchronized(this)当前对象就是当前的Thread1对象。
new Thread(td).start();
new Thread(td).start();
new Thread(td).start();
3个Thread1对象,每个线程都在自己这个对象上加锁,互不影响。

可以通过参数传一个公共对象,或者使用唯一的对象,比如利用字符串的性质使用synchronized("abc"),
或者synchronized(Thread1.class)等等

[/Quote]
它只有一个Thread1对象好伐.这个this是同一个对象.
问题的关键在于lz写的不对.synchronized(this)应该写在While外面.
LZ这样写在同步块完成到进入下一个循环前这段时间,其他线程可以抢占
winmenaruto 2009-12-13
  • 打赏
  • 举报
回复
那我这么写可以么:synchronized(i)?
码域空间 2009-12-13
  • 打赏
  • 举报
回复
和Runnable接口有一点点关系
winmenaruto 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zangxt 的回复:]
synchronized(this)当前对象就是当前的Thread1对象。
new Thread(td).start();
new Thread(td).start();
new Thread(td).start();
3个Thread1对象,每个线程都在自己这个对象上加锁,互不影响。

可以通过参数传一个公共对象,或者使用唯一的对象,比如利用字符串的性质使用synchronized("abc"),
或者synchronized(Thread1.class)等等

[/Quote]
其实, private int i=5;
所有的线程都是一起共用的 那我这么写可以么:synchronized(i)?

还有问下,一个类里面的成员变量,各个对象都是共用的么?是不是public的,就各个对象单独使用的?
ZangXT 2009-12-13
  • 打赏
  • 举报
回复
synchronized(this)当前对象就是当前的Thread1对象。
new Thread(td).start();
new Thread(td).start();
new Thread(td).start();
3个Thread1对象,每个线程都在自己这个对象上加锁,互不影响。

可以通过参数传一个公共对象,或者使用唯一的对象,比如利用字符串的性质使用synchronized("abc"),
或者synchronized(Thread1.class)等等
winmenaruto 2009-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zangxt 的回复:]
每个线程用的都是自身的锁,多个线程之间并不是互斥的
[/Quote]
那怎么写,才能做到线程间都互斥??
synchronized(this){的意思不是,
把当前对象的锁放在Thread-1上面的?那应该怎么理解synchronized(this)呢
ZangXT 2009-12-13
  • 打赏
  • 举报
回复
每个线程用的都是自身的锁,多个线程之间并不是互斥的

62,620

社区成员

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

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