如下代碼所示,為什么繼承了Thread的線程使用同步方法的時(shí)候無(wú)法鎖住呢?而使用同步代碼塊就沒(méi)有問(wèn)題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)
{
// 創(chuàng)建 3 個(gè)窗口
TicketSell t1 = new TicketSell("A窗口");
TicketSell t2 = new TicketSell("B窗口");
TicketSell t3 = new TicketSell("C窗口");
// 啟動(dòng) 3 個(gè)窗口進(jìn)行買票
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
{
// 模擬賣一次票所需時(shí)間
Thread.sleep(10);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(this.currentThread().getName() + "賣出一張票,剩余" + (--num) + "張");
}
}
}這是輸出....A窗口賣出一張票,剩余2張C窗口賣出一張票,剩余1張B窗口賣出一張票,剩余0張A窗口賣出一張票,剩余-1張
3 回答

拉莫斯之舞
TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
上面這個(gè)寫(xiě)法,synchronized 只是修飾了一個(gè)public方法,這個(gè)方法只屬于當(dāng)前實(shí)例,同一個(gè)實(shí)例內(nèi)才會(huì)同步
把方法改成static修飾或者像上面描述的那樣,synchronized修飾代碼塊也可以

qq_笑_17
TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
可以啊,關(guān)鍵是看你選擇同步的鎖的類型,如你縮寫(xiě)使用的是類實(shí)例作為鎖,而每個(gè)實(shí)例都被自己使用當(dāng)然不涉及到互斥的問(wèn)題。
Java并并發(fā)編程實(shí)踐中對(duì)共享變量所加的鎖應(yīng)該是相同鎖。
添加回答
舉報(bào)
0/150
提交
取消