/*
同步的另一个弊端:
容易引发死锁。
开发时,尽量避免同步嵌套的情况。
*/
同步的另一个弊端:
容易引发死锁。
开发时,尽量避免同步嵌套的情况。
*/
class Ticket implements Runnable
{
private int num = 100;
boolean flag = true;
Object obj = new Object();
public void run()
{
if(flag)
{
while(true)
{
synchronized(obj)
{
sale();
}
}
}
else
while(true)
{
this.sale();
}
}
public synchronized/**/ void sale()//同步函数。
{
synchronized(obj)
{
if(num>0)
{
try{Thread.sleep(10);}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"..sale:"+num--);
}
}
}
}
class ThreadDemo7_Ticket_DeadLock
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
try{Thread.sleep(10);}catch(InterruptedException e){}
t.flag = false;
t2.start();
}
}
死锁代码演示
class Demo implements Runnable {
private boolean flag;
Demo(boolean flag) {
this.flag = flag;
}
public void run() {
if (flag) {
while (true) {
synchronized (MyLock.LOCKA) {
System.out.println("if locka");
synchronized (MyLock.LOCKB) {
System.out.println("if lockb");
}
}
}
} else {
while (true) {
synchronized (MyLock.LOCKB) {
System.out.println("else lockb");
synchronized (MyLock.LOCKA) {
System.out.println("else locka");
}
}
}
}
}
}
class MyLock {
public static final Object LOCKA = new Object();
public static final Object LOCKB = new Object();
}
class ThreadDemo8_DeadLock {
public static void main(String[] args) {
Demo d1 = new Demo(true);
Demo d2 = new Demo(false);
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();
}
}