博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发编程笔记二:synchronized锁住了谁?
阅读量:6762 次
发布时间:2019-06-26

本文共 1836 字,大约阅读时间需要 6 分钟。

  hot3.png

在并发编程中要使用到关键字synchronized,当我们用synchronized关键字修饰一个方法时,代表着一个锁(Lock),那么这个锁的对象是什么,也就是它锁住了谁?

synchronized的使用情况大概就是下面几种:

  • synchronized修饰非静态方法
  • synchronized修饰静态方法
  • 同步代码块的synchronized (this)
  • 同步代码块的synchronized (非this对象)
  • 同步代码块的synchronized (类.class)

实际上,synchronized修饰非静态方法、同步代码块的synchronized (this)用法和synchronized (非this对象)的用法锁的是对象,线程想要执行对应同步代码,需要获得对象锁。

synchronized修饰静态方法以及同步代码块的synchronized (类.class)用法锁的是类,线程想要执行对应同步代码,需要获得类锁。

看下面代码:

public class MultiThread {	private static int num = 0;		/** static */	public  synchronized void printNum(String tag){		try {						if(tag.equals("a")){				num = 100;				System.out.println("tag a, set num over!");				Thread.sleep(1000);			} else {				num = 200;				System.out.println("tag b, set num over!");			}						System.out.println("tag " + tag + ", num = " + num);					} catch (InterruptedException e) {			e.printStackTrace();		}	}		//注意观察run方法输出顺序	public static void main(String[] args) {				//俩个不同的对象		final MultiThread m1 = new MultiThread();		final MultiThread m2 = new MultiThread();				Thread t1 = new Thread(new Runnable() {			@Override			public void run() {				m1.printNum("a");			}		});				Thread t2 = new Thread(new Runnable() {			@Override 			public void run() {				m2.printNum("b");			}		});						t1.start();		t2.start();			}}

printNum方法加了synchronized关键字,根据输入参数不同打印不同信息,当我们执行main方法时,发现貌似synchronized没起作用。控制台输入如下:

tag a, set num over!tag b, set num over!tag b, num = 200tag a, num = 200

这是因为synchronized锁住的是对象,线程t1t2分别获取的是m1,m2的锁,他们并没有在获取锁上有竞争关系,因此,出现非同步的结果。

那如果要让printNum方法在多个对象之间也是线程安全的呢,一个对象在执行这个方法时,其他对象必须阻塞等待,一次只能有一个对象能执行这个方法。只需要加个static关键字来修饰printNum方法,这时synchronized关键字锁住的就是MultiThread的.class类了。

public static synchronized void printNum(String tag)...

这时的输出结果就符合我们的预期了

tag b, set num over!tag b, num = 200tag a, set num over!tag a, num = 100

转载于:https://my.oschina.net/binxin/blog/810655

你可能感兴趣的文章
庆科:从安全设计上突破,云上物联网操作系统进化之路
查看>>
简洁的 Bash Programming 技巧
查看>>
linux[ubuntu]下mysql字符集设置
查看>>
验证码的前世今生(今生篇)
查看>>
云平台打造智慧水务新模式
查看>>
nfc近场通信
查看>>
ElasticSearch Bulk 源码解析
查看>>
大文件断点续传
查看>>
用Consul实现选主
查看>>
MSSQL · 特性分析 · 列存储技术做实时分析
查看>>
18. Html5的局: 用WebVR来解释小米VR眼镜
查看>>
Four measures to achieve good governance in cloud computing
查看>>
IBM DS 5300存储硬盘故障数据恢复案例
查看>>
C# 操作Excel之旁门左道 [ C# | Excel ]
查看>>
使用ECharts对数据进行可视化
查看>>
Semaphore维护当前访问自身的线程个数
查看>>
PHP高级编程之消息队列
查看>>
MongoDB 主从配置
查看>>
configure: error: Cannot find ldap libraries in /usr/lib
查看>>
centos7 mysql数据库安装和配置
查看>>