1. 程式人生 > >同步函式中使用鎖

同步函式中使用鎖

如果同步函式被靜態修飾後,使用的鎖是什麼呢?

通過驗證,發現不是this,因為靜態方法中也不可以定義this。

靜態進記憶體時,記憶體中沒有本類物件,但是一定有該類對應的位元組碼檔案物件。
類名.class,該物件的型別是Class.


靜態的同步方法,使用的鎖是剛方法所在類的位元組碼檔案物件,類名.class

class Ticket implements Runnable
{
private static int tick = 100;
Object obj = new Object();
public boolean flag=true;
public void run()
{
if (flag)
{
while (true)
{
//show();
synchronized(Ticket.class)
{
if(tick>0)
{
try {Thread.sleep(10);}catch (Exception e){}
System.out.println(Thread.currentThread().getName()+"code...sale:"+tick--);
}
}
}

}
else
while (true)
{
show();
}
}
public static synchronized void show()
{
if(tick>0)
{
try{Thread.sleep(10);}catch (Exception e){}

System.out.println(Thread.currentThread().getName()+"show...sale:"+tick--);
}

}
}


class StaticMethodDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();

new Thread(t).start();

try{Thread.sleep(10);}catch(Exception e){}
t.flag = false;
new Thread(t).start();
//new Thread(t).start();
//new Thread(t).start();
//new Thread(t).start();


}
}

同步函式用的是哪個鎖呢?
函式需要被物件呼叫,那麼函式都有一個所屬物件引用。就是this。
所以同步函式使用的鎖是this。

通過該程式進行驗證。

使用兩個執行緒來買票。
一個執行緒在同步程式碼塊中。
一個執行緒在同步函式中。
都在執行賣票動作。

class Ticket implements Runnable
{
private int tick = 100;
Object obj = new Object();
public boolean flag=true;
public void run()
{
if (flag)
{
while (true)
{
//show();
synchronized(obj)
{
if(tick>0)
{
try {Thread.sleep(10);}catch (Exception e){}
System.out.println(Thread.currentThread().getName()+"code...sale:"+tick--);
}
}
}

}
else
while (true)
{
show();
}
}
synchronized void show()
{
if(tick>0)
{
try{Thread.sleep(10);}catch (Exception e){}

System.out.println(Thread.currentThread().getName()+"show...sale:"+tick--);
}

}
}


class ThisLockDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();

new Thread(t).start();

try{Thread.sleep(10);}catch(Exception e){}
t.flag = false;
new Thread(t).start();
//new Thread(t).start();
//new Thread(t).start();
//new Thread(t).start();


}
}