这一章节我们来讨论一下临界区。
一般来说,我们使用多线程都是直接在方法上面加上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(); } } } }
这一章节就到这里,谢谢。
-----------------------------------
目录