码迷,mamicode.com
首页 > 编程语言 > 详细

从头认识java-18.5 临界区

时间:2016-01-26 12:38:10      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

这一章节我们来讨论一下临界区。

一般来说,我们使用多线程都是直接在方法上面加上synchronized,但是其实这样有些时候对于性能来说,有所欠缺,因此今天来讨论一下临界区的问题。

1.一般做法的例子

class ThreadA implements Runnable {
	private synchronized void test() throws InterruptedException {
		System.out.println("dosomething");
		Thread.sleep(5000);
		System.out.println("dosomething");
	}

	@Override
	public void run() {
		while (true) {
			try {
				test();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

上面的代码是我们一般的作法,当然,我将上面的时间延长了一些,但是有没有想过,其实在第一个dosomething的地方,我们不需要线程安全(例如,大部分的时候都是查询数据库的功能,不涉及修改),而第二个dosomething的地方才需要线程安全,那么,由于整个方法都要求线程安全,在方法执行的过程中,其他线程不能执行里面的其他方法,如果这个方法需要执行很久,(例如上面的Thread.sleep(5000);),这个时候性能就会出现问题,因此,我们引入临界区这个概念。


2.什么是临界区?

导致竞态条件发生的代码区称作临界区。

也就是上面的第二个dosomething,我们只需要在他这里做线程安全即可


3.怎么使得临界区线程安全?

(1)使用synchronized,因为synchronized不单可以用在方法上面,还可以用在代码块、类上面

class ThreadA implements Runnable {
	private void test() throws InterruptedException {
		System.out.println("dosomething");
		Thread.sleep(5000);
		synchronized (this) {//线程同步的地方
			System.out.println("dosomething");
		}
	}

	@Override
	public void run() {
		while (true) {
			try {
				test();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

(2)使用ReentrantLock

class ThreadA implements Runnable {

	private ReentrantLock reentrantLock = new ReentrantLock();

	private void test() throws InterruptedException {
		System.out.println("dosomething");
		Thread.sleep(5000);
		reentrantLock.lock();
		try {
			System.out.println("dosomething");
		} finally {
			reentrantLock.unlock();
		}
	}

	@Override
	public void run() {
		while (true) {
			try {
				test();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

总结:这一章节主要介绍临界区的使用。


这一章节就到这里,谢谢。

-----------------------------------

目录



从头认识java-18.5 临界区

标签:

原文地址:http://blog.csdn.net/raylee2007/article/details/50585738

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!