synchronized关键字

本文介绍Java中如何使用synchronized关键字实现多线程间的互斥访问,避免资源竞争冲突,通过示例代码详细解释了不同应用场景下的具体用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程的互斥(synchronized关键字)

多线程操作同一个资源时会发生混乱的情况,而synchronized关键字能够有效的防止这种情况的发生。

比较普遍的例子:多人在同一时间存取同一账户的资金、以及项目中某些公共资源的访问和修改。

常见的用法:

1、在方法内锁定某一段语句

<span style="white-space:pre">	</span>private String symbol = "resource";
	private void outPut(String str){
		int len = str.length();
		synchronized (symbol) {
			for(int i =0;i<len;i++){
				System.out.println(str.charAt(i));
			}
			System.out.println();
		}
	}

锁定的资源不能是基础的数据类型,一般是引用类型、String。


2、锁定整个方法

	private synchronized void outPut1(String str){
		int len = str.length();
		for(int i =0;i<len;i++){
			System.out.println(str.charAt(i));
		}
		System.out.println();
	}

以上代码等价于

<span style="white-space:pre">	</span>private void outPut1(String str){
		synchronized(this){
			int len = str.length();
			for(int i =0;i<len;i++){
				System.out.println(str.charAt(i));
			}
			System.out.println();
		}
	}

2种写法锁定的都是this当前对象。

当在多个线程中,同一个Object调用outPut1()方法时,会检查当前的Object是否被锁定,如果锁定则会等待其它线程释放Object资源,否则直接执行方法outPut1();


还有一种常见的写法是锁定类的字节码

<span style="white-space:pre">	</span>class SynchronizedDemo{
		private void outPut(String str){
			synchronized(SynchronizedDemo.class){
				int len = str.length();
				for(int i =0;i<len;i++){
					System.out.println(str.charAt(i));
				}
				System.out.println();
			}
		}
	}

以上代码等价于  

<span style="white-space:pre">	</span>class SynchronizedDemo{
		private static synchronized void outPut(String str){
			int len = str.length();
			for(int i =0;i<len;i++){
				System.out.println(str.charAt(i));
			}
			System.out.println();
		}
	}

不管是锁定类synchronized(Object.class)还是锁定类的对象synchronized(this),只需要注意那些可能会被更改的公共资源,如果程序中有多个入口来修改它,就考虑用synchronized关键字。







评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值