基本上是从这篇文章转过来的:
http://developer.51cto.com/art/200908/143504.htm
1.对于同步方法和对象:
无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的不同对象访问。
解释一下“取得的锁都是对象”的意思:如果一个对象有多个synchronized方法,只要一个线程访问了这个对象中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法,但是对于不是synchronized的方法可以访问。而对于其他线程里的另一个对象可以访问synchronized方法。
2.对于同步块:
synchronized(要锁定的对象) {……}
当要锁定的对象为this时表示的是调用这个方法的对象。
3.对于同步static 方法:
不管调用方法的是类还是对象,锁定的都是类。即类被锁定了,只要一个线程中的对象或类访问了一个synchronized static方法,其他线程里的不管是类还是对象都不能再访问synchronized static方法了。
注:以上的对象即指一个类的实例。
再通过例子说明一下以上几点:
假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都能够调用他们。
1. 把synchronized当作函数修饰符时,示例代码如下:
1. Public synchronized void method(){
2. //….
3. }
这也就是同步方法,那这时synchronized锁定的是哪个对象呢?他锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中 执行这个同步方法时,他们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了 synchronized关键字的方法。
上边的示例代码等同于如下代码:
1. public void method()
2. {
3. synchronized (this) // (1)
4. {
5. //…..
6. }
7. }
(1)处的this指的是什么呢?他指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程式也可能在这种情形下摆脱同 步机制的控制,造成数据混乱。
2.同步块,示例代码如下:
1. public void method(SomeObject so) {
2. synchronized(so)
3. {
4. //…..
5. }
6. }
这时,锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
1. class Foo implements Runnable
2. {
3. private byte[] lock = new byte[0]; // 特别的instance变量
4. Public void method()
5. {
6. synchronized(lock) { //… }
7. }
8. //…..
9. }
注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。
3.将synchronized作用于static 函数,示例代码如下:
1. Class Foo
2. {
3. public synchronized static void method1() // 同步的static 函数
4. {
5. //….
6. }
7. public void method2()
8. {
9. synchronized(Foo.class) // class literal(类名称字面常量)
10. }
11. }
代码中的method2()方法是把class literal作为锁的情况,他和同步的static函数产生的效果是相同的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。
记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不相同,不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。
能 够推断:假如一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为他们的锁都不相同。A方法的锁是Obj所 属的那个Class,而B的锁是Obj所属的这个对象。
搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。
分享到:
相关推荐
总结来说,`synchronized`关键字在Java中提供了线程安全的保证,通过方法加锁、代码块加锁和静态方法加锁,我们可以根据需求选择合适的同步策略。正确使用`synchronized`可以避免竞态条件和死锁等问题,从而保证多...
### 总结 `synchronized`关键字在Java多线程编程中起到关键作用,它可以防止数据竞争,保证共享资源的线程安全。通过同步方法和同步语句块,我们可以控制对共享数据的访问,并通过类锁和对象锁区分不同级别的锁定...
总结,`synchronized`是Java中实现线程同步的重要机制,它的核心在于监视器锁和互斥性。理解和合理使用`synchronized`能够帮助我们构建稳定、高效的多线程程序,但同时也要注意避免潜在的死锁和性能问题。在实际编程...
#### 四、总结 `synchronized`关键字是Java中实现线程安全的重要手段之一。通过将方法或代码块声明为同步,可以有效地防止多线程环境下可能出现的数据竞争和不一致性问题。需要注意的是,虽然`synchronized`能够...
#### 四、总结 通过上述例子可以看出,`synchronized`关键字有效地帮助开发者控制多线程环境下的资源访问,避免了线程间的数据竞争问题。需要注意的是,合理地使用`synchronized`不仅能够提高程序的并发性能,还能...
总结,`synchronized`是Java中实现线程安全的关键工具,理解其工作原理和使用方式对于编写高效、安全的多线程程序至关重要。然而,在实际应用中,我们需要根据具体场景选择最合适的并发控制手段,平衡性能和安全性。
#### 六、总结 通过上述分析可以看出,`synchronized`关键字是Java多线程编程中不可或缺的一部分。它不仅提供了一种简单有效的同步机制,还具备自动解锁和可重入等高级特性,使得开发人员能够轻松地编写出高效且...
Java中的`synchronized`关键字是多线程...总结,`synchronized`是Java多线程编程中不可或缺的一部分,它通过锁机制保证了共享资源的线程安全。了解并熟练掌握`synchronized`的使用,有助于编写出高效且正确的并发程序。
总结来说,`synchronized`、`wait()`和`notify()`是Java中实现线程同步和通信的重要工具,合理运用它们可以有效地解决多线程编程中的数据一致性和线程调度问题。然而,过度使用锁可能会导致性能瓶颈,因此在实际应用...
在Java编程语言中,`...总结,`java synchronized demo`是一个关于如何在Java中使用`synchronized`关键字进行线程同步的示例,通过理解和实践这个例子,开发者可以更好地掌握多线程环境下数据安全和同步的重要性。
总结来说,synchronized和ReentrantLock都是Java并发编程中的重要工具,它们各有优缺点。选择使用哪一个取决于具体的应用场景和性能需求。理解它们的工作原理,以及如何在实际项目中有效利用,是每个Java开发者必备...
总结来说,`synchronized`适用于简单的同步需求,而`ReentrantLock`在需要更细粒度控制、中断锁、公平性等高级特性的场合更为适用。在实际编程中,根据具体需求选择合适的方式,能有效提升并发程序的稳定性和性能。...
总结,理解并熟练运用`synchronized`是Java多线程编程的基础,通过它,我们可以构建出稳定、高效的并发程序。在实际应用中,应根据具体场景选择合适的方法,结合其他并发工具,如`Lock`,以达到最佳的性能和安全性。
总结起来,`@synchronized`是一种便捷的多线程同步手段,通过递归互斥锁实现代码的原子性。在使用时应注意以下几点: 1. `@synchronized`是基于对象的,传入的对象不能为`nil`,否则无效。 2. 由于使用了递归锁,它...
总结来说,synchronized关键字和单例模式在Java中都是保证线程安全的有效手段。synchronized用于控制多线程对共享资源的访问,而单例模式则保证类只有一个实例,防止多线程环境下的资源冲突。在实际开发中,应根据...
Java作为一种广泛使用的编程语言,其提供了内置的同步机制来实现锁的功能,其中"Synchronized"关键字是最为常用的方式之一。在Java高并发编程领域,理解Synchronized锁的升级机制是非常重要的。 首先需要知道的是,...
总结来说,`synchronized`关键字在Java中扮演着至关重要的角色,它是保证多线程环境下数据一致性的重要工具。通过合理使用synchronized方法和synchronized块,开发者可以有效地控制并发访问,防止数据竞争问题,确保...
总结来说,`synchronized`是Java中实现线程同步的关键机制,确保了多线程环境下的数据一致性。理解它的用法和工作原理对于编写健壮的多线程程序至关重要。正确使用`synchronized`可以帮助开发者避免竞态条件和死锁等...
总结来说,`synchronized`在Java并发编程中扮演着核心角色,它通过锁机制确保了共享资源的安全访问,解决了多线程环境下的数据一致性问题。正确理解和使用`synchronized`对于编写高效、线程安全的Java代码至关重要。