A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 男人你得有范 中级黑马   /  2014-8-29 23:40  /  828 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
* 如果同步函数被静态所修饰后,使用的锁是什么?
*
* 通过验证发现使用的锁不再是this,因为静态方法中也不可以定义this
*
* 静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
* 类名.class   该对象的类型是Class
*
* 静态同步方法使用的锁是该方法所在类的字节码文件对象。类名.class
* */
  1. class Ticket3 implements Runnable
  2. {
  3.         private static int tick = 1000;
  4.         //Object obj = new Object();
  5.         boolean flag = true;

  6.         public void run()
  7.         {
  8.                 if (flag)
  9.                 {
  10.                         while (true)
  11.                         {
  12.                                 synchronized (Ticket3.class)
  13.                                 {
  14.                                         if (tick > 0)
  15.                                         {
  16.                                                 try
  17.                                                 {
  18.                                                         Thread.sleep(10);
  19.                                                 }
  20.                                                 catch (Exception e)
  21.                                                 {

  22.                                                 }
  23.                                                 System.out.println(Thread.currentThread().getName()
  24.                                                                 + "----code sale---------:" + tick--);
  25.                                         }

  26.                                 }
  27.                         }
  28.                 }
  29.                 else
  30.                         while (true)
  31.                                 show();

  32.         }

  33.         //同步函数被static所修饰
  34.         public static synchronized void show()
  35.         {
  36.                 if (tick > 0)
  37.                 {
  38.                         try
  39.                         {
  40.                                 Thread.sleep(10);
  41.                         }
  42.                         catch (Exception e)
  43.                         {

  44.                         }
  45.                         System.out.println(Thread.currentThread().getName() + "----sale:"
  46.                                         + tick--);
  47.                 }

  48.         }
  49. }

  50. public class StaticLockDemo
  51. {
  52.         public static void main(String[] args)
  53.         {

  54.                 Ticket3 t = new Ticket3();// 不是一个线程
  55.                 Thread t1 = new Thread(t);// 创建一个线程
  56.                 Thread t2 = new Thread(t);// 创建一个线程
  57.                 //Thread t3 = new Thread(t);// 创建一个线程
  58.                 // Thread t4 = new Thread(t);// 创建一个线程

  59.                 t1.start();
  60.                 try
  61.                 {
  62.                         Thread.sleep(100);
  63.                 }
  64.                 catch(Exception e)
  65.                 {
  66.                        
  67.                 }
  68.                 t.flag = false;
  69.                 t2.start();
  70.         }
  71. }
复制代码

评分

参与人数 1黑马币 +5 收起 理由
格子、 + 5

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马