如下代码所示,为什么继承了Thread的线程使用同步方法的时候无法锁住呢?而使用同步代码块就没有问题
package leetcode;
import javax.swing.plaf.synth.SynthSeparatorUI;
import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable;
public class mainEntry
{
public static void main(String[] agrs)
{
// 创建 3 个窗口
TicketSell t1 = new TicketSell("A窗口");
TicketSell t2 = new TicketSell("B窗口");
TicketSell t3 = new TicketSell("C窗口");
// 启动 3 个窗口进行买票
t1.start();
t2.start();
t3.start();
}
}
class TicketSell extends Thread
{
private static int num = 50;
public TicketSell(String name)
{
super(name);
}
@Override
public void run()
{
for(int i = 0;i<50;i++)
sell();
}
public synchronized void sell() {
if (num > 0)
{
try
{
// 模拟卖一次票所需时间
Thread.sleep(10);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(this.currentThread().getName() + "卖出一张票,剩余" + (--num) + "张");
}
}
}
这是输出
....
A窗口卖出一张票,剩余2张
C窗口卖出一张票,剩余1张
B窗口卖出一张票,剩余0张
A窗口卖出一张票,剩余-1张
可以啊,关键是看你选择同步的锁的类型,如你缩写使用的是类实例作为锁,而每个实例都被自己使用当然不涉及到互斥的问题。
Java并并发编程实践中对共享变量所加的锁应该是相同锁。
上面这个写法,synchronized 只是修饰了一个public方法,这个方法只属于当前实例,同一个实例内才会同步
把方法改成static修饰或者像上面描述的那样,synchronized修饰代码块也可以
没有使用同一个锁加锁