多线程(一):synchronized关键字(同步锁、可重入锁、非公平锁)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/seesun2012/article/details/84550387

首先,什么是锁,为什么要用这个玩意儿?
掌握Java中锁是Java多线程编程中绕不开的知识,只有知道理解Java各种锁才能在编码过程中灵活运用,写出更高效的多线程程序。而理解掌握锁的第一步,可从宏观上对比理解一下各种锁概念。


synchronized同步锁:

public class UserInfoService {

	/** 普通代码 **/
	public String getUserInfo(String id) {
		// TODO
		Sysotem.out.println("--------------普通代码(无锁)--------------");
		return null;
	}

	// 同步锁(锁方法体)
	public synchronized String getUserInfo(String id) {
		// TODO
		Sysotem.out.println("--------------同步锁(锁方法体)--------------");
		return null;
	}

	// 同步锁(锁代码块)
	public String getUserInfo(String id) {
		synchronized (this) {
			// TODO
			Sysotem.out.println("--------------同步锁(锁代码块)--------------");
		}
		return null;
	}

}	

synchronized可重入锁:
可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。
对于Java ReentrantLock而言, 他的名字就可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁。
对于Synchronized而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。

synchronized void setA() throws Exception{
	Thread.sleep(1000);
	setB();
}

synchronized void setB() throws Exception{
	Thread.sleep(1000);
}

上面的代码就是一个可重入锁的一个特点,如果不是可重入锁的话,setB可能不会被当前线程执行,可能造成死锁。




持续更新中…

如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553,个人微信:seesun2012

你的提问是小编创作灵感的来源!
































猜你喜欢

转载自blog.csdn.net/seesun2012/article/details/84550387
今日推荐