Synchronized常见用法
来源:互联网 发布:语文试卷编制软件 编辑:程序博客网 时间:2024/06/01 17:32
Synchronized常见的用法
在学习了《Java 核心技术 卷I》之后,对Synchronized有了比较系统的认知
Synchronized的使用方法可以分为修饰代码块和修饰方法两大类,往下细分为5小类:
- 修饰代码块
- Synchronized(a1)-括号带参数
- Synchronized(this)-括号带对象
- Synchronized(someClass.Class)-括号带类
- 修饰方法
- Synchronized-修饰普通方法
- Synchronized-修饰静态方法
接下来将对以上方法举例说明:
Synchronized修饰代码块
- 1.Synchronized(a1)-括号带参数
public int method(int a1){ synchronized(a1) { //每一次只能有一个线程进入该代码块 }}
Synchronized(a1)修饰代码块的使用过程中,括号带着变量。每一次只有一个线程进入该代码块.只有该线程执行完代码块的所有代码并释放锁时,其他线程才能逐个进入该代码块。此时,线程获得的是成员锁
- 2.Synchronized(obj)-括号带对象
class Test implements Runnable{ private Obj obj; //创建Obj的实例 public Test(Obj obj) { this.obj = obj; //对obj进行初始化 } public void run() { synchronized (obj) { obj.method(); //method是obj中的方法 } }}
如上代码,当Synchronized(obj)-括号带对象时,若某线程进入,获得对象锁,期间其他试图访问obj对象的线程将会阻塞,直到该线程访问obj对象结束。即某线程获得该对象的对象锁之后,就能对其拥有使用权,而其他的线程这时候只能等待其释放锁。
Ps:我们知道synchronized(obj)锁定的是对象,如果有两个对象,那么就会有两把锁分别锁定相应对象,而这两把锁是互不干扰的,不形成互斥,也就是说两个对象的两个线程可以同时执行。
- 3.Synchronized(someClass.Class)-括号带类
public static void method() { synchronized(Obj.class) { //todo } }
Synchronized作用于一个类Obj时,是给这个类Obj加对象锁。与第二类别:“括号带对象”不同的是,Obj的所有对象用的是同一把锁。也就是说,该类所有的对象中只有一个线程能获得对象锁,拥有其使用权,等其释放锁的时候,其他线程才能相继进入。而上边的第二类别:“括号带对象”的准则是每一个对象只能允许一个线程进入,N个对象可以进入N个进程,互不干扰。这一点要谨记。
Synchronized修饰方法
- 4.Synchronized-修饰普通方法
方法一:public synchronized void method(){ // todo}
方法二:public void method(){ synchronized(this) { // todo }}
Synchronized-修饰普通方法比较简单,写法二修饰的是一个代码块,写法一与写法二是的效果是一致的,都是锁定了整个方法时的内容。当线程进入该方法时,其他线程都不允许进入。
- 5.Synchronized-修饰静态方法
public synchronized static void method() { //todo }
静态方法、静态变量都是属于类的而不属于对象。触类旁通,synchronized修饰的静态方法锁定的也是这个类的所有对象。即作用的范围是该类的生成的对象。
小结:
1. 如果synchronized作用的是一个静态方法或一个类,则锁定的该类,即该类所有的对象共享同一把锁;
2. 如果它作用的方法是非静态的,则它取得的锁是对象;
发表人:梦想的边缘
- Synchronized常见用法
- synchronized的用法以及常见的使用错误
- synchronized用法
- synchronized用法
- synchronized用法
- Synchronized 用法
- synchronized用法
- synchronized用法
- Synchronized用法
- synchronized用法
- synchronized用法
- Synchronized用法
- Synchronized用法
- synchronized用法
- synchronized用法
- synchronized用法
- synchronized用法
- java中synchronized用法
- oracle中层次查询start by ... connect by....详解
- 每天一条liunux--touch命令
- 关于Notification通知的一点愚见(自定义通知栏)
- 便捷提醒小插件之gritter
- mybatis传List
- Synchronized常见用法
- Netty使用MessagePack首先自定义编解码器
- Android 系统签名
- ListView去掉分割线
- CSS :hover和:active区别
- iOS SQLCipher SQLite加密 详解
- jQuery选择器总结
- “(null)” is of a model that is not supported by this version of Xcode. Ple
- NSCalendar + NSDateComponents