一个线程同步的问题synchronized

zhmyjsy 2006-12-11 04:44:01

下面的程序是没问题的,我想知道2个问题:
1。 synchronized(a1)为什么这里是this就不对了?

2。这个try和catch有必要吗?
try
{
sleep(1);
}catch(InterruptedException e)
{System.out.println(e);}



public class Account1
{
private String name;
private int value;
public static void main(String[]args)
{
Account1 a1=new Account1();

(new Save1(a1,100)).start();
(new Save1(a1,200)).start();
(new Fetch1(a1,100)).start();




}

void put(int i)
{
value=value+i;
}
int get(int i)
{
if(value>i)
value=value-i;
else
{
i=value;
value=0;
}
return i;
}
int howmatch()
{
return value;
}
}
class Save1 extends Thread
{
private Account1 a1;
private int amount;
public Save1(Account1 a2,int amount)
{
a1=a2;
this.amount=amount;
}
public void run()
{
synchronized(a1)
{
int k=a1.howmatch();
try
{
sleep(1);
}catch(InterruptedException e)
{System.out.println(e);}
a1.put(amount);
System.out.println("现有"+k+",存入"+amount+",余额"+a1.howmatch());
}
}


}


class Fetch1 extends Thread
{
private Account1 a1;
private int amount;
public Fetch1(Account1 a3,int amount)
{
this.a1=a3;
this.amount=amount;
}


public void run()
{
synchronized(a1)
{
int k=a1.howmatch();
try
{
sleep(1);
}catch(InterruptedException e)
{System.out.println(e);}
a1.get(amount);
System.out.println("现有"+k+",取走"+amount+",余额"+a1.howmatch());
}
}
}
...全文
141 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
88324877 2006-12-11
  • 打赏
  • 举报
回复
恩~是指里面的run 方法休眠一秒。
zhmyjsy 2006-12-11
  • 打赏
  • 举报
回复
(new Save1(a1,100)).start();
(new Save1(a1,200)).start();
(new Fetch1(a1,100)).start();

那就是说 new Save1(a1,100)).start();然后休眠1毫秒。这个线程就死了
然后 (new Save1(a1,200)).start(); 然后休眠1毫秒。这个线程就死了

然后 (new Fetch1(a1,100)).start(); 然后休眠1毫秒。这个线程就死了


这样解释对把?
zhmyjsy 2006-12-11
  • 打赏
  • 举报
回复
(new Save1(a1,100)).start();
(new Save1(a1,200)).start();
(new Fetch1(a1,100)).start();

那就是说 new Save1(a1,100)).start();然后休眠1毫秒。
然后 (new Save1(a1,200)).start(); 然后休眠1毫秒。
然后 (new Fetch1(a1,100)).start(); 然后休眠1毫秒。

这样解释对把?
fool_leave 2006-12-11
  • 打赏
  • 举报
回复
sleep(1)就是说停止1毫秒,然后接着运行
这个程序用sleep(1)我不知道为什么
至于sleep多久要看程序需要了
zhmyjsy 2006-12-11
  • 打赏
  • 举报
回复
不好意思,初学这里,我的问题比较多,谢谢大侠指教!

那用这个sleep(1);就是说这个线程运行完了,就死了是吗?

这里用的是1,就是让它休眠0。001秒对把,这个里面的休眠时间有什么规定吗?比如大小最好是多少
fool_leave 2006-12-11
  • 打赏
  • 举报
回复
为了不要独享cpu
你也不想这个程序一运行,整个机器都不响应吧
zhmyjsy 2006-12-11
  • 打赏
  • 举报
回复
哦,明白了

但是为什么要用 sleep(1);那?
trueyellow 2006-12-11
  • 打赏
  • 举报
回复
加锁对象应该是帐号(Account的实例a1),而不是save1实例和fetch1实例.
当然应该用a1而不是this了.

1. synchronized(obj | class)的意义是只有当前thread拥有obj的实例锁或者class的类锁,才能执行该语句块。
2. 若synchronized加在方法上,对于实例方法,相当于synchronized(this),需要实例锁才能执行;对于static方法,相当于synchronized(this.class),需要类锁才能执行.问题归结到原则1.
3. 实例锁和类锁没有任何关系,拥有类锁不意味着同时拥有了实例锁。再,两种锁都是可重入的。
fool_leave 2006-12-11
  • 打赏
  • 举报
回复
Synchronized的用法,看看这个就明白了
http://www.chinablog.com/user2/leave/archives/2006/129429.shtml


try...catch....
很有必要,sleep抛出异常一定要捕捉
wy158457 2006-12-11
  • 打赏
  • 举报
回复
jf

62,612

社区成员

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

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