请问Java中线程锁是到底怎么锁的,谢谢。
/**
* Created by zx on 2014/8/11.
*/
public class SellTickets
{
public static void main(String[] args)
{
SellWindow sellWindow = new SellWindow();
for (int i = 1; i
{
new Thread(sellWindow, String.valueOf(i)).start();
}
}
}
class SellWindow implements Runnable
{
Integer tickNum = 0;
boolean flag = true;
@Override
public void run()
{
while(tickNum
{
synchronized (tickNum)
{
System.out.println("窗口 " + Thread.currentThread().getName() + " 已售出第 " + ++tickNum + " 张票");
}
}
}
}
我运行这段代码,好像不能锁住tickNum这个对象,还是会被乱序输出。
请问要如何更改才能让输出结果为:
窗口 * 已售出第 1 张票
…………
窗口 * 已售出第 47 张票
窗口 ** 已售出第 48 张票
窗口 * 已售出第 49 张票
窗口 *** 已售出第 50 张票
这样的从1-50顺序呢?
还有能介绍一下synchronized的具体用法还有括号中和方法体中具体放如何的数据呢,谢谢。
------解决方案--------------------
擦,你的tickNum是会变动的,每个线程都是一个新的tickNum,这怎么锁的住
------解决方案--------------------
import java.util.concurrent.atomic.AtomicInteger;
public class SellTickets
{
public static void main(String[] args)
{
SellWindow sellWindow = new SellWindow();
for (int i = 1; i
{
new Thread(sellWindow, String.valueOf(i)).start();
}
}
}
class SellWindow implements Runnable
{
private AtomicInteger tickNum = new AtomicInteger(0);
boolean flag = true;
@Override
public void run()
{
synchronized(tickNum)
{
while(tickNum.getAndIncrement()
{
System.out.println("窗口 " + Thread.currentThread().getName() + " 已售出第 " +tickNum.get() + " 张票");
}
}
}
}
------解决方案--------------------
引用:Quote: 引用:import java.util.concurrent.atomic.AtomicInteger;
public class SellTickets
{
public static void main(String[] args)
{
SellWindow sellWindow = new SellWindow();
for (int i = 1; i
{
new Thread(sellWindow, String.valueOf(i)).start();
}
}
}
class SellWindow implements Runnable
{
private AtomicInteger tickNum = new AtomicInteger(0);
boolean flag = true;
@Override
public void run()
{