Synchronized关键字
【摘要】 Synchronized关键字每个Java对象都隐含有一把锁,这里称为Java内置锁(或者对象锁、隐式锁)。使用synchronized(syncObject)调用相当于获取syncObject的内置锁,所以可以使用内置锁对临界区代码段进行排他性保护。在多线程的环境下,多个线程同时访问共享资源会出现一些问题,而synchronized关键字是用来保证线程同步的,可以保证它修饰的方法或者代码...
Synchronized关键字
每个Java对象都隐含有一把锁,这里称为Java内置锁(或者对象锁、隐式锁)。使用synchronized(syncObject)
调用相当于获取syncObject的内置锁,所以可以使用内置锁对临界区代码段进行排他性保护。
在多线程的环境下,多个线程同时访问共享资源会出现一些问题,而synchronized
关键字是用来保证线程同步的,可以保证它修饰的方法或者代码块在任意时刻只能有一个线程执行。
synchronized关键字的三大特性如下:
- 原子性:一个或多个操作要么全部执行成功,要么全部执行失败,synchronized关键字可以保证只有一个线程拿到锁,访问共享资源。
- 可见性:当一个线程对共享变量进行修改后,其他线程可以立刻看到。执行synchronized时,会对应执行lock、unlock原子操作,保证可见性。
- 有序性:程序的执行顺序会按照代码的先后顺序执行。
synchronized可以保证并发编程的三大特性:原子性、可见性、有序性,而volatile关键字只能保证可见性和有序性。
synchronized
的作用范围如下:
synchronized
作用于非静态方法时,锁住的是对象的实例,即this
对象。synchronized
作用于静态方法时,锁住的是Class
实例,因为静态方法属于Class
而不属于对象。synchronized
作用于一个代码块时,锁住的是在所有代码块中配置的对象。
使用synchronized关键字所抢占的同步锁什么时候释放?
synchronized
代码块或方法正确执行完毕,监视锁自动释放- 程序出现异常,非正常退出
synchronized
块,监视锁也会自动释放
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)