/*
* 如果同步函数被静态所修饰后,使用的锁是什么?
*
* 通过验证发现使用的锁不再是this,因为静态方法中也不可以定义this
*
* 静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
* 类名.class 该对象的类型是Class
*
* 静态同步方法使用的锁是该方法所在类的字节码文件对象。类名.class
* */
- class Ticket3 implements Runnable
- {
- private static int tick = 1000;
- //Object obj = new Object();
- boolean flag = true;
- public void run()
- {
- if (flag)
- {
- while (true)
- {
- synchronized (Ticket3.class)
- {
- if (tick > 0)
- {
- try
- {
- Thread.sleep(10);
- }
- catch (Exception e)
- {
- }
- System.out.println(Thread.currentThread().getName()
- + "----code sale---------:" + tick--);
- }
- }
- }
- }
- else
- while (true)
- show();
- }
- //同步函数被static所修饰
- public static synchronized void show()
- {
- if (tick > 0)
- {
- try
- {
- Thread.sleep(10);
- }
- catch (Exception e)
- {
- }
- System.out.println(Thread.currentThread().getName() + "----sale:"
- + tick--);
- }
- }
- }
- public class StaticLockDemo
- {
- public static void main(String[] args)
- {
- Ticket3 t = new Ticket3();// 不是一个线程
- Thread t1 = new Thread(t);// 创建一个线程
- Thread t2 = new Thread(t);// 创建一个线程
- //Thread t3 = new Thread(t);// 创建一个线程
- // Thread t4 = new Thread(t);// 创建一个线程
- t1.start();
- try
- {
- Thread.sleep(100);
- }
- catch(Exception e)
- {
-
- }
- t.flag = false;
- t2.start();
- }
- }
复制代码 |