java中synchronized锁定对象问题
关于synchronized关键字介绍的博客有很多,也很详细,但是还是有很多问题让我很迷惑,比如synchronized锁定对象到底该怎么设置的问题,通过查看资料和理解终于了,向大家分享一下:
迷惑1:为什么一个对象被锁定以后别的线程还可以访问访问该对象的其他非synchronized块的代码?
迷惑2:为什么被上锁对象的其他synchronized块只能被当前拥有锁的线程执行?
class Counter implements Runnable { private int count; public Counter() { count = 0; } public void countAdd() { synchronized (this) { for (int i = 0; i < 5; i++) { try { System.out.println(Thread.currentThread().getName() + ":" + (count++)); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } // 非synchronized代码块,未对count进行读写操作,所以可以不用synchronized public void printCount() { for (int i = 0; i < 5; i++) { try { System.out.println(Thread.currentThread().getName() + " count:" + count); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } public void run() { String threadName = Thread.currentThread().getName(); if (threadName.equals("A")) { countAdd(); } else if (threadName.equals("B")) { printCount(); } } }
调用代码:
结果如下:
A:0
B count:1
A:1
B count:2
A:2
B count:3
A:3
B count:4
A:4
B count:5
上面代码中countAdd是一个synchronized的,printCount是非synchronized的。从上面的结果中可以看出一个线程访问一个对象的synchronized代码块时,别的线程可以访问该对象的非synchronized代码块而不受阻塞。
解释:
synchronized的参数代表被上锁的对象,当编译器遇到synchronized关键字的时候,就会在class文件中生成monitorenter指令。当程序执行遇到monitorenter指令的时候,会预先检查synchronized参数中的对象是否被别的线程持有(即该对象是否被上锁),所以同一个对象如果多个synchronized块只能被一个线程当前拥有同步块的线程随意执行,而别的线程是不能执行该被锁对象的任何synchronized块,但是可以执行其他非同步块方法块代码,因为执行其他的方法不会扫面当前对象是否被上锁,也就是其他非synchronized块没有monitorenter这个指令,所以别的线程可以访问上锁对象的非synchronized代码。
关于synchronized关键字详细介绍请参考:
http://blog.csdn.net/luoweifu/article/details/46613015
相关推荐
Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,synchronized 关键字可以作用于 instance 变量...
Synchronized 和 Static Synchronized 是 Java 中两种同步机制,它们都用于解决多线程并发访问的安全问题。然而,它们之间存在着本质的区别。 Synchronized(对象锁) Synchronized 是一种实例锁,它锁定的是当前...
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...
总的来说,`synchronized`是Java中实现线程安全的关键工具,它通过锁机制保证了对共享资源的有序访问,防止了数据竞争问题。然而,正确使用`synchronized`需要对并发编程有深入理解,以确保性能和正确性之间的平衡。...
- `synchronized`关键字主要用于解决多线程环境中的并发问题,通过它,可以确保同一时间只有一个线程能够执行特定代码块或方法,从而避免数据竞争和不一致状态。 - 它可以防止多个线程同时访问共享资源,保证了...
Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够保持数据的一致性和完整性。本文将深入探讨`synchronized`的两种主要用法:synchronized方法和...
这篇文章将详细介绍 Java 中的 synchronized 机制,通过实例代码,演示如何使用 synchronized解决多线程同步问题。 Java 中的同步机制 在 Java 中,同步机制是通过 synchronized 关键字实现的。synchronized 可以...
当对象被synchronized锁定时,MarkWord会记录锁的相关信息,如轻量级锁或重量级锁的状态。 2. Klass Pointer:这部分存储的是对象所属类的元数据的指针,即对象的类类型。通过这个指针,虚拟机能够识别对象属于哪个...
例如,在使用 synchronized void addOne() 方法时,锁定的是当前对象,保护的资源是对象中的成员属性 value。 四、synchronized 的使用方法 synchronized 的使用方法可以分为两种,一种是使用 synchronized 关键字...
1. **对象锁**:每个Java对象都可以作为一个锁,当调用对象的`synchronized`方法或在代码块中使用`synchronized`关键字时,会获取到这个对象的锁。如果多个线程尝试访问同一个对象的同步代码,只有一个线程能够获得...
Java中的`synchronized`关键字是实现线程同步的关键机制,它保证了在多线程环境下,对共享资源的访问是互斥的,防止了数据竞争和不一致的问题。synchronized通过锁的概念来控制对代码块或方法的访问,分为两种形式:...
3. **锁定对象实例**: 当 `synchronized` 后面跟一个对象时,线程获取的是该对象的锁。这意味着如果一个线程进入了 `synchronized` 代码块,其他线程无法访问该对象的任何 `synchronized` 成员方法或代码块。例如...
压缩包中的`Long.java`文件可能包含了一个具体的示例,演示了如何使用`synchronized`关键字来控制对`Long`对象的访问。通常,这个例子会创建一个`Long`实例,并在多线程环境中使用`synchronized`关键字保护对这个...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
总结,`synchronized`关键字是Java多线程编程中的关键工具,理解并合理运用它,可以帮助开发者编写出高效且线程安全的代码,避免数据竞争和死锁等问题。通过深入学习和实践,可以提升Java程序员在并发编程领域的专业...
总之,`synchronized`关键字是Java中实现线程同步的关键,它通过锁机制保证了共享资源的线程安全访问,防止并发问题。理解并熟练运用`synchronized`可以帮助开发者编写出更加健壮的多线程程序。
在Java编程语言中,`synchronized`关键字是一个非常重要的同步机制,用于控制多线程对共享资源的访问,以防止数据不一致性和竞态条件。本文将深入探讨`synchronized`关键字的用法,包括类锁、对象锁、方法锁以及它们...
- **对象锁**:如果`synchronized`修饰非静态方法或者同步语句块中的对象引用是实例引用,那么锁定的是该实例对象。例如: ```java public class MyObject { public synchronized void method() { // ... } }...
在第二个示例中,我们对累加操作的循环使用了`synchronized`代码块,锁定对象为`SynchronizedDemo.class`。这意味着在任何时候只有一个线程能够执行这段同步代码,确保了线程安全。每个线程在执行前都需要获取到类...
在Java编程中,`synchronized`关键字是用来解决多线程环境下的线程安全问题的关键工具。线程安全意味着当多个线程访问同一段代码时,该代码能够正确地处理并发情况,不会出现数据不一致或者资源竞争的问题。本文将...