synchronized同步记录

记录原因:在开发中查看了一些优秀的图片下载框架,经常用到Synchronized同步,由于自己对同步有点模糊了,特此记录,方便下次查阅!

synchronized分为同步方法和同步代码块。

synchronized锁定的内容可以是具体的对象也可以是当前类的所有对象

synchronized可以有static变量锁和非static变量锁

1.同步方法

        /**
	 * 对象锁<同步方法>  锁定的对象是具体的类对象  多个线程可以访问不同该对象的方法  但是对于同一个对象一次只能访问一次
	 */
	public synchronized void m1() throws InterruptedException {
		Thread.sleep(2000);
		System.out.println("---person.m1---");
	}
当我们开启两个线程测试的时候,分别new出了Person p1,p2。当Thread1访问p1.m1()时,Thread2无法访问p1.m1(),但是Thread2可以访问p2.m1()。用法跟 synchronized(this)是一样的效果。


2.用非static来当锁的时候

        /**
	 * 变量锁<同步块>  这种锁跟上方的对象锁是一个性质  不同线程可以访问不同变量 但是同一个对象一次只能访问一次
	 */
	Object a = new Object();// 变量锁
	public void m2() {
		synchronized (a) {
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("---线程访问了变量锁---");
		}
	}
当我们开启两个线程测试的时候,分别new出了Person p1,p2。当Thread1访问p1.m2()时,Thread2无法访问p1.m1(),但是Thread2可以访问p2.m2()。


3.用static变量 或者 xxx.class 作为锁的时候

<span style="white-space:pre">	</span>static Object b = new Object();// 静态变量锁
	public void m3() {
		synchronized (b) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("---线程访问了静态变量锁---");
		}
	}
这些情况下不乱你开了多少个线程同时访问多少类对象的对象m3只能一次一次的被调用,起到了全局锁的效果。


同步对代码整体的性能是有害无利的,当然我们有时候不得不这么做,当我们用到synchronized的时候切记用对方法才能起到对应的效果。<over!!>


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值