⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 volatile.java

📁 Java Thread Programming (Source
💻 JAVA
字号:
public class Volatile extends Object implements Runnable {
	// not marked as 'volatile', but it should be!
	private int value;  

	private volatile boolean missedIt;

	// doesn't need to be volatile-doesn't change
	private long creationTime; 

	public Volatile() {
		value = 10;
		missedIt = false;
		creationTime = System.currentTimeMillis();
	}

	public void run() {
		print("entering run()");

		// each time, check to see if 'value' is different
		while ( value < 20 ) {

			// Used to break out of the loop if change to 
			// value is missed.
			if  ( missedIt ) {
				int currValue = value;

				// Simply execute a synchronized statement on an
				// arbitrary object to see the effect.
				Object lock = new Object();
				synchronized ( lock ) {
					// do nothing!
				}

				int valueAfterSync = value;

				print("in run() - see value=" + currValue +
					", but rumor has it that it changed!");
				print("in run() - valueAfterSync=" + 
					valueAfterSync);

				break; 
			}
		}

		print("leaving run()");
	}

	public void workMethod() throws InterruptedException {
		print("entering workMethod()");

		print("in workMethod() - about to sleep for 2 seconds");
		Thread.sleep(2000);

		value = 50;
		print("in workMethod() - just set value=" + value);

		print("in workMethod() - about to sleep for 5 seconds");
		Thread.sleep(5000);

		missedIt = true;
		print("in workMethod() - just set missedIt=" + missedIt);

		print("in workMethod() - about to sleep for 3 seconds");
		Thread.sleep(3000);

		print("leaving workMethod()");
	}

	private void print(String msg) {
		// This method could have been simplified by using 
		// functionality present in the java.text package, 
		// but did not take advantage of it since that package 
		// is not present in JDK1.0.

		long interval = System.currentTimeMillis() - 
						creationTime;

		String tmpStr = "    " + ( interval / 1000.0 ) + "000";
		
		int pos = tmpStr.indexOf(".");
		String secStr = tmpStr.substring(pos - 2, pos + 4);

		String nameStr = "        " + 
				Thread.currentThread().getName();

		nameStr = nameStr.substring(nameStr.length() - 8, 
									nameStr.length());
		
		System.out.println(secStr + " " + nameStr + ": " + msg);
	}

	public static void main(String[] args) {
		try {
			Volatile vol = new Volatile();

			// slight pause to let some time elapse
			Thread.sleep(100);  

			Thread t = new Thread(vol);
			t.start();

			// slight pause to allow run() to go first
			Thread.sleep(100);  

			vol.workMethod();
		} catch ( InterruptedException x ) {
			System.err.println(
				"one of the sleeps was interrupted");
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -