解决方案 »
- 初学者如何学习java
- 用JAVA验证数学表达式的正确性并可计算结果!
- javamail软件中如何判断新邮件?
- 如何封杀恶意IP访问网页?在线求救。
- 提问
- 如何把一个javabean中的所有属性值存到一个Map对象中
- 既然是对象的引用,为什么不行呢?
- jsp后缀的应该怎样打开?
- 我的Applet中总提示“没有代理”,但离开服务器就正常!(200分)
- 急救!!!!一个大小写的问题!给100
- 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--;
}
}
}