标签:
这一章节我们来讨论一下临界区。
一般来说,我们使用多线程都是直接在方法上面加上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();
}
}
}
}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();
}
}
}
}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();
}
}
}
}
这一章节就到这里,谢谢。
-----------------------------------
标签:
原文地址:http://blog.csdn.net/raylee2007/article/details/50585738