synchronized(this) 与synchronized(class) 之间的区别
? 一、概念synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的。 锁机制有如下两种特性:
二、对象锁和类锁1. 对象锁在 Java 中,每个对象都会有一个 monitor 对象,这个对象其实就是 Java 对象的锁,通常会被称为“内置锁”或“对象锁”。类的对象可以有多个,所以每个对象有其独立的对象锁,互不干扰。 2. 类锁在 Java 中,针对每个类也有一个锁,可以称为“类锁”,类锁实际上是通过对象锁实现的,即类的 Class 对象锁。每个类只有一个 Class 对象,所以每个类只有一个类锁。 三、synchronized 的用法分类synchronized 的用法可以从两个维度上面分类: 1. 根据修饰对象分类synchronized 可以修饰方法和代码块
2. 根据获取的锁分类
四、synchronized 的用法详解这里根据获取的锁分类来分析 synchronized 的用法 1、对象锁这个对象是新建的,跟其他对象没有任何关系: /** * synchronized 修饰非静态方法 */ private void sync5() { Log.d(TAG,Thread.currentThread().getName() + "_Sync5: " + new SimpleDateFormat("HH:mm:ss").format(new Date())); synchronized (new SyncThread()) { try { Log.d(TAG,Thread.currentThread().getName() + "_Sync5_Start: " + Date())); Thread.sleep(2000); Log.d(TAG,Thread.currentThread().getName() + "_Sync5_End: " + Date())); } catch (InterruptedException e) { e.printStackTrace(); } } } 文章后面所有例子都是采用这四个线程,只是对方法进行修改: SyncThread syncThread = SyncThread(); Thread F_thread1 = new Thread(new SyncThread(),"F_thread1"); Thread F_thread2 = ); Thread F_thread3 = new Thread(syncThread,"F_thread3"); Thread F_thread4 = ); F_thread1.start(); F_thread2.start(); F_thread3.start(); F_thread4.start(); ?运行结果如下: ? ? ? 四个线程同时开始,同时结束,因为作为锁的对象与线程是属于不同的实例。 2、采用类锁,无所谓哪个类,都会被拦截:Date())); synchronized (MainActivity.class) { (InterruptedException e) { e.printStackTrace(); } } } ?运行结果如下: 可以发现,采用类锁一次只能通过一个。即使采用的是?MainActivity.class 这个类锁。 3、采用 this 对象锁:synchronized (this (InterruptedException e) { e.printStackTrace(); } } } ??运行结果如下: 可以发现线程1,2同时结束,3,4有先后,原因是3,4同属于一个实例。 4、synchronized 修饰方法作用范围是整个方法,所以方法中所有的代码都是同步的: */ private synchronized void sync5() { Log.d(TAG,1)"> Date())); { Log.d(TAG,1)"> Date())); Thread.sleep(2000); Log.d(TAG,1)"> Date())); } (InterruptedException e) { e.printStackTrace(); } } ?修饰非静态方法: 对于非静态方法,同一个实例的线程访问会被拦截,非同一实例可以同时访问。 即此时是默认对象锁(this)。 修饰静态方法结果 可以看出来,静态方法默认类锁。 ? 总结1、对于静态方法,由于此时对象还未生成,所以只能采用类锁; 2、只要采用类锁,就会拦截所有线程,只能让一个线程访问。 3、对于对象锁(this),如果是同一个实例,就会按顺序访问,但是如果是不同实例,就可以同时访问。 4、如果对象锁跟访问的对象没有关系,那么就会都同时访问。 ? 参考文章:Java 之 synchronized 详解(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SEVERE:没有找到Java类java.util.ArrayList和MIME媒体类型
- Java Swing组件定制CheckBox示例
- 从jack迁移到本机Java 8
- java – 使用Apache HttpComponents客户端签署AWS HTTP请求
- java – 自动装箱:所以我可以写:整数i = 0;而不是:Integ
- java – 用于调试和错误的不同log4j布局?
- java – EasyMock中Mockito.spy/doReturn的类比是什么?
- java – Immutable对象如何帮助减少垃圾回收引起的开销?
- Java用于取得当前日期相对应的月初,月末,季初,季末,年初
- java condition 实现简单的阻塞队列