java面試之synchronized 和 static synchronized

  • 面試的時候遇到了題目關於synchronize 和static synchronized的問題 , 如題

其實我的理解 完全偏差 , 因此回來後認真的研究了下, 寫了個simpleDemo 供大家參考,

總結: synchronized  加到方法前面 和 synchronized{  xxxxxxx} 代碼塊類似 , 都是synchronized(this){xxxx}(有木有感覺很可怕?)

將該對象 加鎖, 記住, 是鎖住整個對象, 若static的synchronized則鎖的是這個class, 所以答案也就一目瞭然了。

追求性能的話, 建議大家慎用synchronized

 

答案: 

不能

不能

不能

不能

 

demo 如下
 

package cn.com.flaginfo;

import java.util.Date;
import java.util.concurrent.TimeUnit;

public class A {

	private static boolean isTrue;
	private static Object sss = new Object();
	
	public static synchronized void staticWrite(boolean b) throws InterruptedException{
		System.out.println("staticWrite·" + new Date());
		TimeUnit.SECONDS.sleep(2);
		isTrue = b;	
	}
	
	public static synchronized boolean staticRead() throws InterruptedException{
		System.out.println("staticRead·"+ new Date());
		TimeUnit.SECONDS.sleep(2);
		return isTrue;
	}
	
	public synchronized void write(boolean b) throws InterruptedException{
		System.out.println("write·"+ new Date());
		TimeUnit.SECONDS.sleep(2);
		isTrue = b;
	}
	
	public  void write1(boolean b) throws InterruptedException{
		
		synchronized(sss){
		System.out.println("write·"+ new Date());
		TimeUnit.SECONDS.sleep(2);
		isTrue = b;
		}
	}
	
	public synchronized boolean read() throws InterruptedException{
		System.out.println("read·"+ new Date());
		TimeUnit.SECONDS.sleep(2);
		return isTrue;
	}
	
	public static void main(String[] args) throws Exception{
		final A a = new A();
		new Thread(new Runnable(){

			@Override
			public void run() {
				
				try {
					System.out.println("調用staticWrite(true)");
					a.write(true);
//					A.staticWrite(true);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
		}).start();
		TimeUnit.MILLISECONDS.sleep(200);
		new Thread(new Runnable(){

			@Override
			public void run() {
				
				try {
					System.out.println("調用staticRead()");
//					A.staticRead();
					a.read();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
		}).start();
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章