从头认识java-18.5 临界区

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

一般来说,我们使用多线程都是直接在方法上面加上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();
			}
		}
	}
}

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

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

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

目录

时间: 2024-10-28 18:46:35

从头认识java-18.5 临界区的相关文章

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

java 18位身份证验证小组件idchecker

原文:java 18位身份证验证小组件idchecker 源代码下载地址:http://www.zuidaima.com/share/1550463500012544.htm 代码运行结果: 其它调用方法: package com.zuidaima.idchecker.test; import cn.idchecker.check.Checker; /** * idchecker测试 * @author http://www.zuidaima.com * */ public class Test

java线程 同步临界区:thinking in java4 21.3.5

thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.thread.critical; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutorService; import java.uti

java 18 - 12 模拟斗地主洗牌、发牌,并对发的牌进行排序

1 /* 2 模拟斗地主的发牌功能(发牌完毕后发到手上的牌是有顺序的) 3 分析: 4 A:创建一个HashMap集合 5 B:创建一个ArrayList集合 6 C:创建两个字符串,一个是花色,一个是牌的数字 (发牌得有一盒牌) 7 为了方便以后的排序,创建这两个字符串的时候,按照大小顺序排列(斗地主中的大小顺序) 8 大小王除外 9 D:把这两个字符串放进HashMap集合中(拼接一起 花色+牌号) 同时给每个放进去牌进行编码0--52并存储 10 同时也给ArrayList集合中存储编码,

java 18 - 10 Collections工具类的常用方法

Collections:是针对集合进行操作的工具类,都是静态方法. 要知道的方法 A:public static <T> void sort(List<T> list):排序 默认情况下是自然顺序. B:public static <T> int binarySearch(List<?> list,T key):二分查找 C:public static <T> T max(Collection<?> coll):最大值 D:publi

java 18 - 9 HashMap和ArrayList的嵌套3

ArrayList集合嵌套HashMap集合并遍历. 需求: 假设ArrayList集合的元素是HashMap.有3个. 每一个HashMap集合的键和值都是字符串. 元素如下,请遍历. 结果: 周瑜---小乔 吕布---貂蝉 郭靖---黄蓉 杨过---小龙女 令狐冲---任盈盈 林平之---岳灵珊 1 package zl_MapDemo; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.uti

java 18 - 8 HashMap和ArrayList的嵌套2

数据乱扯的 结果: 小说 三大名著 三国演义 吕布 30 赵云 28 西游记 孙悟空 600 唐僧  30 武侠小说 笑傲江湖 令狐冲  26 林平之 28 神雕侠侣 郭靖   40 杨过 23 分析: 总的集合是 HashMap<String,HashMaP<String,ArrayList<Person>>>, 子集合:HashMaP<String,ArrayList<Person>> ArrayList<Person> 1 pa

java 18 - 7 HashMap和ArrayList的嵌套1

需求: 假设HashMap集合的元素是ArrayList.有3个. 每一个ArrayList集合的值是字符串. 元素如下,请遍历. 结果: 三国演义 吕布 赵云 笑傲江湖 令狐冲 林平之 神雕侠侣 郭靖 杨过 1 package zl_MapDemo; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Set; 6 public class MapAndArrayList { 7 8 pu

从头学Java【3】——之命名方法

1.命名法 对于变量.数组.方法/函数.类和对象,如何规范地进行命名至关重要,尤其是当程序规模扩大,变量数量激增的情况下.比较著名的命名规则: (1)匈牙利命名法 这种命名方法是由Microsoft程序员查尔斯·西蒙尼(Charles Simonyi) 提出的,C语言中常用此种命名法.标识符的名字以一个或者多个小写字母开头作为前缀:前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途.例如:lpszStr, 表示指向一个以'\0'结尾的字符串(sz)的长指针(lp)变量. (2

Java(18) 集合框架

一.集合框架 Collectoin                   Map List           set              HashMap ArrayList LinkedList  HashSet 1.1 List的方法 List<元素> list = new ArrayList<元素类型>() list.add(元素);//增加元素 list.add(元素);//向指定位置插入元素 list.remove(元素);//删除指定小标的元素 list.remov