解决方案 »
- JFileChooser設置默認文件名
- MyEclipse,JBuilder,NetBeans那一款软件更适合做界面?
- 想要转移一个多级目录,而且要保证目录路径的一致性,请问大侠应该怎么作啊?
- 小弟初学JAVA对接口这一概念不是很了解希望指点一下!
- 一个Java设计模式的问题,高手救我!
- 在程序中怎样判断一个java文件是否能够成功编译。
- 莱鸟在数据库连接时出现错误,请帮忙!
- 高人指点一下
- 就是一个错误,但不明白!!
- 我今天刚用java,问题很猜,请指教!
- Java集合是放对象的,那么如何放,他的原理是什么。最好有大婶能给我解释一下。求解
- 判断下面2段代码,能否通过编译:①:byte b = 2; b = b + 8; ②:byte b = 2; b += 8;
不是多个现成调用同一个sell,如果是static的sell方法那才是多个线程调用同一个sell方法synchronized才有效果
我也不是很懂,但是好像是这样的
2、同步方法和同步块都是通过同步监视器来实现同步的,只不过同步块可以自己指定同步监视器,而同步方法使用默认的监视器,即该方法当前所在对象的引用(this);
st1、st2、st3、st4中的同步块用的监视器都是static Object obj=new Object();因为该静态变量对SellThread类的所有实例来说都是一样的,所以它们可以实现同步;
但st1、st2、st3、st4四个 实例中的sell()方法用的同步监视器分别是st1、st2、st3、st4,所以无法同步
可以照下面参考下:package Lesson8;class SellThread extends Thread {
private Tickets tickets;
public SellThread(Tickets tickets)
{
this.tickets=tickets;
}
public void run() {
while (tickets.getNum()>0) {
try {
sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
tickets.sell();
}
}
}public class Demo3 {
public static void main(String args[]) {
Tickets tickets=new Tickets(20);
SellThread st1 = new SellThread(tickets);
SellThread st2 = new SellThread(tickets);
SellThread st3 = new SellThread(tickets);
SellThread st4 = new SellThread(tickets);
st1.start();
st2.start();
st3.start();
st4.start();
}
}class Tickets
{
private int num=0;
public int getNum()
{
return num;
}
public Tickets(int num)
{
this.num=num;
}
public synchronized void sell()// 线程同步方法
{
if (num > 0) {
System.out.println(Thread.currentThread().getName()
+ " sell tickets:" + num);
num--;
}
}
}