【java】synchronized 关键字

大一的时候对这个东西敬而远之,可能是因为刚学java,完全不理解,现在是时候搞清楚它了。

字面意思是同步,翻译过来挺绕的。从同步和异步这对概念来入手,是比较难理解的。其实只要围绕“互斥”这个概念,synchronized关键字就很好理解!

大二操作系统会介绍互斥的概念,与java中的含义完全相同,只不过一个是操作系统中的,一个是java jvm的,应用层次不同而已。

1.我理解的java中的互斥是,在多线程环境下,对同一数据进行更新操作的互斥,也即只有当一个线程执行完更新后,另一个线程才可以开始。这也是synchronized关键字的用处。

举个例子,老生常谈了,存钱的例子。比如A的账户是100,现准备在atm中存入100,在这个过程中,A的朋友正在用手机银行,也试图往A的账户存入100。那么,在理论上就会有一个t1时刻,在t1时刻,atm机获取了A账户余额100,还未加100,同时A友的手机银行后台也获取了余额100,然后再各自进行加100的操作,更新A的账户,可想而知,A最后只有200,而非300。

问题出在对账户的更新必须互斥,atm在更新的时候,其他方式就必须等待,atm更新完了,才能开始其他的更新操作。这就是互斥。

2.锁的概念。这也是synchronized用法中的一个关键点。锁其实是互斥的标志。定义了哪些更新操作需要互斥。比如在A更新时,B的账户更新就不应该被阻塞,A和B的账户更新完全没有关系。而A的atm更新就应该和A的手机银行更新互斥。所以,锁定义了互斥的条件。


java中的锁

方法锁:

在非static方法上加synchronized关键字,那么同一个对象的所有的带有synchronized的方法全部互斥;锁就是调用的对象。所有的线程要想调用这个方法,必须拿到该对象的锁,锁只能被一个线程拥有。

块锁:

锁一段代码,需要指定锁是什么,可以是类锁可以使对象锁。块锁的优势是可以精确锁的范围,提高性能。

静态方法锁:

只能应用于静态方法,线程需要拿到类的锁才可以执行,不同对象也会被互斥。

例子:

package main;

public class Main {

	public static void main(String[] args) {
        new Main().f();
	}
	
	public void f(){
		final Acount acount1 = new Acount();
		for(int j=0;j<10;j++){
			Thread thread = new Thread(new Runnable() {
				
				@Override
				public void run() {
					acount1.add1(100);
				}
			});
			thread.start();
		}
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("1结果: "+acount1.getMoney());
	}
}

package main;


public class Acount{

	private int money = 0;

	public synchronized void add(int inc){
		System.out.println("*********开始********");
		int temp = this.money;
		temp = temp + inc;
		this.money = temp;
		System.out.println(money);
		System.out.println("*********结束********");
	}
	
	public void add1(int inc){
		synchronized (this) {
			System.out.println("*********开始********");
			int temp = this.money;
			temp = temp + inc;
			this.money = temp;
			System.out.println(money);
			System.out.println("*********结束********");
		}
	}

	public int getMoney() {
		return money;
	}
}

最后打印结果的时候,需要等待的原因是打印语句执行时,可能之前的更新线程还未全部执行完毕。

推荐一篇很好的博客:http://www.cnblogs.com/paddix/p/5367116.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值