转的http://www.blogjava.net/site120/archive/2007/01/09/92496.html
1 , Synchronized
锁定的是对象而非函数或代码。
2 , 每个Object只有一把锁(Lock)与之关联,当进行到Synchronized
语句或函数的时候,这把锁就会被当前的线程(thread)拿走,其他的(thread)再去访问的时候拿不到锁就被暂停了
3, 只有当Synchronized
的是同一个对象的才是线程安全的(thread-safe)
如:
1) public Synchronized
void method1 : 锁住的是该对象,类的其中一个实例 , 当该对象(仅仅是这一个对象
)在不同线程中执行这个同步方法时,线程之间会形成互斥.达到同步效果,但如果不同线程同时对该类的不同对象执行这个同步方法时,则线程之间不会形成互斥,因为他们拥有的是不同的锁.
2) Synchronized
(this){ //TODO } 同一
3) public Synchronized
static
void method3 : 锁住的是该类,当所有该类的对象(多个对象
)在不同线程中调用这个static 同步方法时,线程之间会形成互斥,达到同步效果 , 但如果多个线程同时调用method1 , method3,则不会引互斥,具体讲看最后讲解.
4) Synchronized
(Test.class){ //TODo} 同三
5) synchronized(o) {} 这里面的o可以是一个任何Object对象或数组,并不一定是它本身对象或者类,谁拥有o这个锁,谁就能够操作该块程序代码.
这里面1) 与2) 是线程安全的,但1)与3) , 2)与3) 他们所拥有的锁不一样,故不是同步的,不是线程安全的.
最后, synchronized 所同步的代码应该尽量少.如果没有必要同步的就不要列为其中
联想到数据库的并发控制
假如有如下操作
1) 从数据库中读取数据
2) 修改数据
3) 提交数据
解决方案一
1) 读取数据
synchronized(XXX)
{
2)修改数据
3) 提交数据
}
解决方案二
synchronized(XXX)
{
1) 读取数据
2)修改数据
3) 提交数据
}
解决方案三
synchronized(XXX)
{
3) 提交数据
}
这里面到底用哪一种方案视具体情况而定, 要注意的是synchronized(同步)的代价,开销是很大的.
分享到:
相关推荐
《深入剖析synchronized锁原理——从Java对象头的角度》 synchronized关键字在Java中扮演着重要的角色,它是Java实现同步的基础,确保了多线程环境下的数据一致性。不同于基于JDK实现的Lock接口(如ReentrantLock)...
首先,`synchronized`锁通常被称为对象锁或重量锁,它基于Java虚拟机(JVM)中的Monitor对象实现。Monitor由对象头中的2个比特位(Tag)标记,当Tag为10时,表示该对象持有重量锁。Monitor地址指向了一个管理线程...
这篇初级教程专注于使用C++实现同步机制中的对象锁,这在处理多线程共享资源时非常关键。C++标准库提供了多种工具来支持并发编程,其中包括`synchronized`关键字,尽管它在C++中并不直接存在,但在Java中广泛使用。...
在Objective-C中,当你使用`@synchronized`块包围一段代码时,会为指定的对象创建一个互斥锁。如果当前线程已经持有了该锁,那么它可以再次获取并执行内部的代码,而不会造成死锁。这种特性使得在嵌套使用`@...
- **重入性**:`synchronized`支持锁的重入,即同一个线程可以再次获取同一对象的锁,这允许在同步代码内部调用同步方法。 - **锁升级与锁粗化**:为了提高效率,Java虚拟机会根据情况优化锁的实现,包括从偏向锁...
了解 JVM 锁机制中的 synchronized 和 Lock 实现原理 在 Java 中,锁机制是数据同步的关键,存在两种锁机制:synchronized 和 Lock。了解这两种锁机制的实现原理对于理解 Java 并发编程非常重要。 synchronized 锁...
除了了解基本使用和案例外,深入理解它们的底层实现,如锁膨胀、降级,以及轻量级锁、重量级锁、自旋锁和偏斜锁等概念,对于成为一个合格的Java并发开发者至关重要。同时,掌握java.util.concurrent.locks包中的其他...
Java虚拟机(JVM)在创建和管理对象时涉及多个关键概念和技术,这些概念与对象的内存布局、对象头、对象锁以及`synchronized`关键字的底层实现密切相关。在JVM中,对象的创建过程分为几个步骤: 1. **类加载检查**:...
在深入讲解 `synchronized` 底层实现之前,我们先回顾一下锁的升级和降级的概念。 锁的升级和降级是 JVM 为了优化 `synchronized` 性能而引入的一种策略。在低竞争情况下,JVM 会尽量减少锁带来的开销,从而提高...
【Java核心技术】synchronized是Java内置的关键字,用于实现线程同步,确保多线程环境下的数据一致性。...通过深入学习这些高级锁机制,不仅可以提升对Java并发的理解,也能在实际项目中更好地解决并发问题。
### JAVA线程深入了解 #### 一、JAVA线程启动方式详解 ##### 1. 利用`Thread`类的子类启动线程 在Java中,可以通过继承`Thread`类来创建一个新的线程。这种方式相对直观,易于理解。具体做法是创建一个`Thread`类...
- **线程方法**:wait()使线程进入WAITING状态,释放对象锁;sleep()使线程进入TIMED_WAITING状态,不释放锁;yield()让当前线程让出CPU时间片,重新竞争。 了解这些锁机制和线程操作对于编写高性能、高并发的Java...
线程安全问题的解决方案不仅仅是添加`synchronized`关键字那么简单,还需要正确理解锁的范围和作用对象。在编写多线程代码时,应当尽量减少锁的粒度,以提高并发性能。同时,过度依赖同步可能导致死锁、活锁等问题,...
7. **synchronized**关键字:synchronized提供了锁机制,它可以保证同一时间只有一个线程执行特定代码块,从而解决了线程安全问题。同时,synchronized还能保证代码块的有序性。 8. **happens-before**原则:这是...
Java中的`synchronized`是可重入的,意味着如果一个线程已经获得了某个对象的锁,并尝试再次获取该锁(比如在同步方法内部调用了另一个同步方法,而这两个方法都同步同一个对象),它将不会被阻塞,可以直接进入。...
在Java中,偏向锁会在对象头中存储线程ID,一旦某线程获得了锁,对象头就会标记为偏向当前线程,后续的访问只要检查是否还是这个线程即可。但是一旦有其他线程尝试获取该锁,偏向锁就会升级为轻量级锁。 **轻量级锁...
内置锁是通过`synchronized`关键字实现的,它隐含地在每个对象上都存在。当一个线程进入一个由`synchronized`修饰的方法或代码块时,会自动获取锁,退出时则自动释放。显式锁则是通过`java.util.concurrent.locks....
首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置的锁,当多个线程尝试访问同一对象的同步方法或同步代码块时,只有一个线程能够获取到这个锁并执行,其他线程则必须等待。这就是Java的互斥锁机制,用于...
理解和掌握线程池的使用、锁的优化(如synchronized、ReentrantLock、ReadWriteLock等)、并发容器的选择(如ConcurrentHashMap、CopyOnWriteArrayList等),以及如何避免死锁、活锁、饥饿等问题,能显著提升系统的...