Volatile.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:3k
源码类别:

进程与线程

开发平台:

Java

  1. public class Volatile extends Object implements Runnable {
  2. // not marked as 'volatile', but it should be!
  3. private int value;  
  4. private volatile boolean missedIt;
  5. // doesn't need to be volatile-doesn't change
  6. private long creationTime; 
  7. public Volatile() {
  8. value = 10;
  9. missedIt = false;
  10. creationTime = System.currentTimeMillis();
  11. }
  12. public void run() {
  13. print("entering run()");
  14. // each time, check to see if 'value' is different
  15. while ( value < 20 ) {
  16. // Used to break out of the loop if change to 
  17. // value is missed.
  18. if  ( missedIt ) {
  19. int currValue = value;
  20. // Simply execute a synchronized statement on an
  21. // arbitrary object to see the effect.
  22. Object lock = new Object();
  23. synchronized ( lock ) {
  24. // do nothing!
  25. }
  26. int valueAfterSync = value;
  27. print("in run() - see value=" + currValue +
  28. ", but rumor has it that it changed!");
  29. print("in run() - valueAfterSync=" + 
  30. valueAfterSync);
  31. break; 
  32. }
  33. }
  34. print("leaving run()");
  35. }
  36. public void workMethod() throws InterruptedException {
  37. print("entering workMethod()");
  38. print("in workMethod() - about to sleep for 2 seconds");
  39. Thread.sleep(2000);
  40. value = 50;
  41. print("in workMethod() - just set value=" + value);
  42. print("in workMethod() - about to sleep for 5 seconds");
  43. Thread.sleep(5000);
  44. missedIt = true;
  45. print("in workMethod() - just set missedIt=" + missedIt);
  46. print("in workMethod() - about to sleep for 3 seconds");
  47. Thread.sleep(3000);
  48. print("leaving workMethod()");
  49. }
  50. private void print(String msg) {
  51. // This method could have been simplified by using 
  52. // functionality present in the java.text package, 
  53. // but did not take advantage of it since that package 
  54. // is not present in JDK1.0.
  55. long interval = System.currentTimeMillis() - 
  56. creationTime;
  57. String tmpStr = "    " + ( interval / 1000.0 ) + "000";
  58. int pos = tmpStr.indexOf(".");
  59. String secStr = tmpStr.substring(pos - 2, pos + 4);
  60. String nameStr = "        " + 
  61. Thread.currentThread().getName();
  62. nameStr = nameStr.substring(nameStr.length() - 8, 
  63. nameStr.length());
  64. System.out.println(secStr + " " + nameStr + ": " + msg);
  65. }
  66. public static void main(String[] args) {
  67. try {
  68. Volatile vol = new Volatile();
  69. // slight pause to let some time elapse
  70. Thread.sleep(100);  
  71. Thread t = new Thread(vol);
  72. t.start();
  73. // slight pause to allow run() to go first
  74. Thread.sleep(100);  
  75. vol.workMethod();
  76. } catch ( InterruptedException x ) {
  77. System.err.println(
  78. "one of the sleeps was interrupted");
  79. }
  80. }
  81. }