找回密码
 FreeOZ用户注册
查看: 1792|回复: 1
打印 上一主题 下一主题

Biased Locking in Java SE 6

[复制链接]
跳转到指定楼层
1#
发表于 30-8-2010 16:20:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
之前一直没有注意到Biased Locking的存在。刚刚做了一下实验,的确如此。
下面是程序实验及相关的出处。不过我把程序小改了一下。

1. 参考文章出处:http://ceki.blogspot.com/2009/06 ... -in-java-se-60.html
2. 输出结果:
  1. $ java LockingInJava2
  2. java.runtime.version = 1.6.0_21-b06
  3. java.vendor          = Sun Microsystems Inc.
  4. java.version         = 1.6.0_21
  5. os.name              = Linux
  6. os.version           = 2.6.32-24-generic
  7. lock creator = Thread-0
  8. runnable[0]: thread name = Thread-0, counter=467
  9. runnable[1]: thread name = Thread-1, counter=47
  10. runnable[2]: thread name = Thread-2, counter=152
  11. runnable[3]: thread name = Thread-3, counter=326
  12. runnable[4]: thread name = Thread-4, counter=2
复制代码
3. 输出结果2:
  1. $ java -XX:-UseBiasedLocking LockingInJava2
  2. java.runtime.version = 1.6.0_21-b06
  3. java.vendor          = Sun Microsystems Inc.
  4. java.version         = 1.6.0_21
  5. os.name              = Linux
  6. os.version           = 2.6.32-24-generic
  7. lock creator = Thread-0
  8. runnable[0]: thread name = Thread-0, counter=250
  9. runnable[1]: thread name = Thread-1, counter=60
  10. runnable[2]: thread name = Thread-2, counter=71
  11. runnable[3]: thread name = Thread-3, counter=99
  12. runnable[4]: thread name = Thread-4, counter=514
复制代码
4. 参考程序(我修改过的版本)
  1. public class LockingInJava2 implements Runnable {

  2. static int THREAD_COUNT = 5;
  3. //static Object LOCK = new Object();
  4. static Object LOCK = null;
  5. static Runnable[] RUNNABLE_ARRAY = new Runnable[THREAD_COUNT];
  6. static Thread[] THREAD_ARRAY = new Thread[THREAD_COUNT];
  7. static String LOCK_CREATOR = null;

  8. private int counter = 0;
  9. private String threadId;

  10. public static void main(String args[]) throws InterruptedException {
  11.    printEnvironmentInfo();
  12.    execute();
  13.    printResults();
  14. }

  15. /**
  16.   * Try to create a biased lock
  17.   */
  18. public synchronized static Object getLock() {
  19.         if(LOCK == null){
  20.                 LOCK = new Object();
  21.                 LOCK_CREATOR = Thread.currentThread().getName();
  22.         }
  23.         return LOCK;
  24. }

  25. public static void printEnvironmentInfo() {
  26.    System.out.println("java.runtime.version = "
  27.        + System.getProperty("java.runtime.version"));
  28.    System.out.println("java.vendor          = "
  29.        + System.getProperty("java.vendor"));
  30.    System.out.println("java.version         = "
  31.        + System.getProperty("java.version"));
  32.    System.out.println("os.name              = "
  33.        + System.getProperty("os.name"));
  34.    System.out.println("os.version           = "
  35.        + System.getProperty("os.version"));
  36. }

  37. public static void execute() throws InterruptedException {
  38.     for (int i = 0; i < THREAD_COUNT; i++) {
  39.       RUNNABLE_ARRAY[i] = new LockingInJava2();
  40.       THREAD_ARRAY[i] = new Thread(RUNNABLE_ARRAY[i]);
  41.     }
  42.     for (Thread t : THREAD_ARRAY) {
  43.       t.start();
  44.     }
  45.     // let the threads run for a while
  46.     Thread.sleep(10000);

  47.     for (int i = THREAD_COUNT - 1; i >= 0; i--) {
  48.       THREAD_ARRAY[i].interrupt();
  49.     }
  50.     Thread.sleep(100); // wait a moment for termination, to lazy for join ;)
  51.   }

  52.   public static void printResults() {
  53.         System.out.println("lock creator = " + LOCK_CREATOR);
  54.     for (int i = 0; i < RUNNABLE_ARRAY.length; i++) {
  55.       System.out.println("runnable[" + i + "]: " + RUNNABLE_ARRAY[i]);
  56.     }
  57.   }

  58.   public void run() {
  59.         threadId = Thread.currentThread().getName();
  60.         Object myLock = getLock();
  61.     for (;;) {
  62.       synchronized (myLock) {
  63.         counter++;
  64.         try {
  65.           Thread.sleep(10);
  66.         } catch (InterruptedException ex) {
  67.           break;
  68.         }
  69.       }
  70.     }
  71.   }

  72.   public String toString() {
  73.     return "thread name = " + threadId + ", counter=" + counter;
  74.   }
  75. }
复制代码
回复  

使用道具 举报

2#
 楼主| 发表于 30-8-2010 16:27:06 | 只看该作者
需要注意的是,我这里运行出来的biased locking结果和原文作者那种极端的starving是不同的,
估计是jdk版本改进后的结果。

原帖由 key 于 30-8-2010 15:20 发表
之前一直没有注意到Biased Locking的存在。刚刚做了一下实验,的确如此。
下面是程序实验及相关的出处。不过我把程序小改了一下。

1. 参考文章出处:http://ceki.blogspot.com/2009/06/biased-locking-in-java-s ...
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 5-12-2025 08:05 , Processed in 0.014350 second(s), 18 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表