证明同步函数的锁是this,静态函数的锁是.class
1.同步函数的锁是this
以卖票的例子证明
class Ticket implements Runnable
{
private int tickets=100;
Object obj=new Object();
boolean flag=true;
public void run()
{
if (flag)
{
while (true)
{
synchronized (obj)
{
if (tickets>0)
{
try{Thread.sleep(10);}catch (Exception e){}
System.out.println(Thread.currentThread().getName()+"-code-"+tickets--);
}
}
}
}
else
while (true)
{
show();
}
}
//定义同步函数
public synchronized void show()
{
if (tickets>0)
System.out.println(Thread.currentThread().getName()+"-show-"+tickets--);
}
}
class DeadLock
{
public static void main(String[] args)
{
Ticket tic=new Ticket();
Thread t1=new Thread(tic);
Thread t2=new Thread(tic);
t1.start();
try{Thread.sleep(10);}catch (Exception e){}
tic.flag=false;
t2.start();
}
}
打印结果为:
Thread-1-show-12
Thread-1-show-11
Thread-1-show-10
Thread-1-show-9
Thread-1-show-8
Thread-1-show-7
Thread-1-show-6
Thread-1-show-5
Thread-1-show-4
Thread-1-show-3
Thread-1-show-2
Thread-1-show-1
Thread-0-code-0
结尾处为0说明线程是不安全的,说明不满足两个条件中的其中之一(1.必须有两个或以上的线程在对同一资源进行操作。2.线程有相同的锁),该代码中不满足第一条,也就是同步代码块中的锁和同步函数中的锁不是一个锁。由实验可得将同步代码块中的obj换为this后线程安全问题得到解决了。
2.静态函数的锁是.class
还以卖票的例子来说明
class Ticket implements Runnable
{
private static int tickets=100;
Object obj=new Object();
boolean flag=true;
public void run()
{
if (flag)
{
while (true)
{
synchronized (obj)
{
if (tickets>0)
{
try{Thread.sleep(10);}catch (Exception e){}
System.out.println(Thread.currentThread().getName()+"-code-"+tickets--);
}
}
}
}
else
while (true)
{
show();
}
}
//定义同步函数
public synchronized static void show()
{
if (tickets>0)
System.out.println(Thread.currentThread().getName()+"-show-"+tickets--);
}
}
class DeadLock
{
public static void main(String[] args)
{
Ticket tic=new Ticket();
Thread t1=new Thread(tic);
Thread t2=new Thread(tic);
t1.start();
try{Thread.sleep(10);}catch (Exception e){}
tic.flag=false;
t2.start();
}
}
打印结果为:
Thread-1-show-14
Thread-1-show-13
Thread-1-show-12
Thread-1-show-11
Thread-1-show-10
Thread-1-show-9
Thread-1-show-8
Thread-1-show-7
Thread-1-show-6
Thread-1-show-5
Thread-1-show-4
Thread-1-show-3
Thread-1-show-2
Thread-1-show-1
Thread-0-code-0
说明线程是不安全的。说明静态函数的锁和obj不是同一把锁,当我们把同步代码块中的锁换为Ticket.class后就成功解决了线程的安全问题。
由此证明静态同步函数的锁是所在类.class。