栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

线程讲解(十七)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线程讲解(十七)

synchronized关键字,我们一般称之为“同步锁”,用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为锁的对象。在用synchronized修饰类时(或者修饰静态方法),默认是当前类的Class对象作为锁的对象,故存在着方法锁、对象锁、类锁这样的概念。

没有设置线程同步的情况

先给出以下代码感受下代码执行的时候为什么需要同步?代码可能比较枯燥,配上业务理解起来就会舒服很多,学生军训,有三列,每列5人,需要报数,每个线程负责每一列报数。

class SynchronizedExample {
	protected static int num = 0;
	protected void numberOff() {
		for(int i=0; i<5; i++) {
			num++;
System.out.println(Thread.currentThread().getName()+":"+SynchronizedExample.num);
		}
	}
}

public class SynchronizedTest {
	public static void main(String[] args) throws InterruptedException {
		SynchronizedExample se = new SynchronizedExample();
		for(int i=1; i<=3; i++) {
			new Thread( ()->  {se.numberOff();}, "线程"+i).start();
		}
	}
}

执行结果如下:
线程1:1线程2:2线程1:3线程3:4.......
之所以出现这种情况,是因为三个线程是异步的,没有同步。
对应的业务场景就是,在第一列没有完成报数的时候,其他队列抢报了,这在现实中是不允许的,所以需要类似于synchronized等具有同步功能的关键字粉末登场。

方法同步锁

当报数方法加上synchronized关键字之后,就会一列一列的报数。

protected synchronized void numberOff() {
	for(int i=0; i<5; i++) {
		num++;
System.out.println(Thread.currentThread().getName()+":"+SynchronizedExample.num);
	}
}

执行结果如下:
线程1:1线程1:2线程1:3线程1:4......

写到这里还是要从技术层面讲下原理,当一个线程执行带有synchronized关键字的方法时,该线程会在该方法处设置一个锁(其他线程打不开这个锁,只能在外边等该线程释放掉该锁,一般都是执行完所有代码后主动释放锁),表示此方法是当前线程独占的,对应到上述业务中就是一次只能有一个队列报数。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356562.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号