0 0

synchronized为什么只能锁对象5

synchronized(obj){
    //
}

synchronized锁的是对象的引用,存放在栈中,为什么设计时不能锁基本类型,同样存放在栈中,
在内存中占用资源。如果说基本类型超过作用域会释放等原因,可以定义静态变量。

问题补充:
remoteJavaSky 写道
如果基本类型可以被锁,那么它就需要有一个锁对象与之关联(在方法执行的时候会获取或释放),还需要一个wait集合与之关联(wait,notify,notifyall使用)
那这个基本类型还算是基本类型了吗?并且已经有了基本类型的包装了,这个不是问题了吧我想


它需要有一个锁对象与之关联干什么,说了设计成锁基本类型,他也在内存中。
wait notify这个是对象的可以作为一个解释。
2011年10月24日 21:28

6个答案 按时间排序 按投票排序

0 0

采纳的答案

刚刚查了下

引用

在java虚拟机中,每个对象和类在逻辑上都是和一个监视器相关联的。
对于对象来说,相关联的监视器保护对象的实例变量。

对于类来说,监视器保护类的类变量。

(如果一个对象没有实例变量,或者一个类没有变量,相关联的监视器就什么也不监视。)
为了实现监视器的排他性监视能力,java虚拟机为每一个对象和类都关联一个锁。代表任何时候只允许一个线程拥有的特权。线程访问实例变量或者类变量不需锁。

但是如果线程获取了锁,那么在它释放这个锁之前,就没有其他线程可以获取同样数据的锁了。(锁住一个对象就是获取对象相关联的监视器)

类锁实际上用对象锁来实现。当虚拟机装载一个class文件的时候,它就会创建一个java.lang.Class类的实例。当锁住一个对象的时候,实际上锁住的是那个类的Class对象。

一个线程可以多次对同一个对象上锁。对于每一个对象,java虚拟机维护一个加锁计数器,线程每获得一次该对象,计数器就加1,每释放一次,计数器就减 1,当计数器值为0时,锁就被完全释放了。


简而言之,就是要对一个对象加锁,需要一个锁指向这个对象,锁有计数器,对这个对象进行监控。。。。。基本类型是不可能被指针指着的。。。。。

2011年10月26日 10:48
0 0

同意asyty的回答。

在Java中,设计可同步的变量时至少要考虑两点:

1.需要有一个锁对象与之关联,在synchronized快或方法中的代码,JVM调用的时候,会尝试去获取被Synchronized 的对象或Class的lock。这样才能达到同步。
2.在执行wait 或notify的时候,需要有一个与之关联的集合来保存这个对象的锁被lock了几次,unlock了几次,满足如可重入锁的需求。这也就和唤醒有关了

因此在设计同步时,基本类型是很难达到同步需求的。即使可以,那么把基本类型设计的如此笨重,还要基本类型干么呢。这事设计的问题,而不是技术可不可以的问题吧

2011年10月26日 12:17
0 0

哦 应该这么说 在JAVA里基本类型是不可能被多个引用指着的

2011年10月26日 10:50
0 0

引用

synchronized锁的是对象的引用,存放在栈中,为什么设计时不能锁基本类型,同样存放在栈中,
在内存中占用资源。如果说基本类型超过作用域会释放等原因,可以定义静态变量。


JAVA中,所有的对象都是继承自Object,Object里面应该封装了锁机制所需要的其他的变量,这样才能使用wait() notify()这类需要锁的函数

打个比方,你要对某个对象加互斥锁,这个对象必须得封装一个mutex互斥量来计数吧,学习过操作系统的人都有一些了解吧。。。。我猜Object这个类里应该与这种机制

而基本类型是不可能封装这些锁变量的吧

2011年10月26日 10:31
0 0

如果基本类型可以被锁,那么它就需要有一个锁对象与之关联(在方法执行的时候会获取或释放),还需要一个wait集合与之关联(wait,notify,notifyall使用)
那这个基本类型还算是基本类型了吗?并且已经有了基本类型的包装了,这个不是问题了吧我想

2011年10月25日 12:35
0 0

都说了 是通过对象的引用来锁了。。。。。。。。。基本类型没有引用吧 怎么锁。。。。

2011年10月25日 12:25

相关推荐

    透彻理解Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别

    Java 中 Synchronized(对象锁)和 Static Synchronized(类锁)的区别 Synchronized 和 Static Synchronized 是 Java 中两种同步机制,它们都用于解决多线程并发访问的安全问题。然而,它们之间存在着本质的区别。...

    lock锁,lock锁和synchronized的对比

    一种显式定义同步锁对象来实现锁,提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock锁。 # synchronized锁与lock锁的对比 Lock是显式锁,需要手动的开启和...

    synchronized锁自旋.docx

    首先,`synchronized`锁通常被称为对象锁或重量锁,它基于Java虚拟机(JVM)中的Monitor对象实现。Monitor由对象头中的2个比特位(Tag)标记,当Tag为10时,表示该对象持有重量锁。Monitor地址指向了一个管理线程...

    synchronized用法大全实例

    本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ### 1. 同步方法 同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该...

    volatile和synchronized的区别

    当一个线程访问某个对象的一个`synchronized`方法时,它就获得了该对象的锁,并且其他线程无法再访问该对象的其他`synchronized`方法。 - **互斥性**:通过`synchronized`关键字实现的锁具有互斥性,也就是说,一次...

    Java synchronized关键_动力节点Java学院整理

    这意味着在同一时间,只能有一个线程持有对象的锁。 2. **可重入性**:一个线程已经获得了某个对象的锁,它还可以再次获取该对象的其他`synchronized`代码块或方法的锁,这就是所谓的可重入性。这不会导致死锁,...

    Java synchronized详细解读.docx

    此外,`synchronized`还有另一种形式,即使用类实例变量作为锁对象。例如,`synchronized (lockObject) { ... }`,这里的`lockObject`是一个对象实例,它可以是一个类内部的私有变量,用于控制特定代码段的同步。...

    synchronized并发讲解源码.zip

    除了锁住对象或类,`synchronized`还可以与`wait()`、`notify()`和`notifyAll()`方法结合使用,实现复杂的线程通信和同步。这些方法都是在`Object`类中定义的,只有在持有对象锁的情况下才能调用,否则会抛出`...

    java synchronized 学习

    * 多个线程访问同一个对象的 synchronized 修饰的方法或代码块时,只允许一个线程拥有 synchronized 同步锁,其他线程只能进行等待。 * 若此对象对应的类中包含了多个 synchronized 修饰的方法或代码块,多个线程...

    java_synchronized详解

    - 当两个并发线程试图访问同一对象的`synchronized(this)`同步代码块时,一次只能有一个线程执行这段代码。其他线程必须等待当前线程执行完毕并释放锁后,才能继续执行。例如: ```java package ts; public ...

    java代码-证明synchronized可重入锁

    在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要机制,它提供了互斥访问,确保了共享资源在同一时刻只能被一个线程访问。`synchronized`的一个重要特性是可重入性,即一个已经获得锁的线程可以再次...

    JAVA synchronized详解

    除了同步方法之外,还可以通过`synchronized`关键字来同步一段代码块,这种情况下需要指定同步监视器(锁对象),例如: ```java public void method() { Object obj = new Object(); synchronized (obj) { // ...

    基于Java synchronized同步锁实现线程交互.pdf

    锁定的对象、方法或代码块只能由一个线程访问,其他线程必须等待当前线程释放锁定后才能访问。 wait()和notify()方法可以用来切换线程状态。wait()方法使当前线程等待,直到其他线程调用notify()方法唤醒当前线程...

    Synchronized 终极说明教程

    当线程进入`synchronized`代码块或方法时,会获取对象的监视器锁,如果锁已被其他线程持有,则该线程将被阻塞,直到锁被释放。线程退出同步块或方法时,会自动释放锁。 三、synchronized的可见性与有序性 1. 可见...

    Java 多线程与并发(4-26)-关键字- synchronized详解.pdf

    * synchronized 关键字只能被一个线程获取,没有获得锁的线程只能等待。 * 每个实例都对应有自己的锁(this),不同实例之间互不影响。 * synchronized 修饰的方法,无论方法正常执行完毕还是抛出异常,都会释放锁。...

    Java synchronized 详解.docx

    Java中的`synchronized`关键字是用来解决多线程环境下的并发访问问题,确保共享资源在同一时间只能被一个线程访问,从而避免数据的不一致性。在Java中,`synchronized`可以应用于方法或者代码块,实现线程同步。 1....

    java基本教程之synchronized关键字java多

    每个Java对象都可以作为锁,`synchronized`关键字实际上是在获取和释放对象的监视器锁(也称为内置锁或互斥锁)。对于非静态方法,锁是当前对象;对于静态方法,锁是对应的类的Class对象。 三、synchronized的两种...

    0积分免费下载,金九银十期间,个人经历的面试题,适合三到五年经验

    (2)ReentrantLock只能修饰代码块,必须新建锁对象使用 (3)Synchronized锁状态存储在JVM中堆里面的对象头中 (4)Synchronized自动获取锁与释放锁,ReentrantLock需要手动调用lock(),unLock()方法获取锁与释放锁 (5)...

    synchronized详解

    在Java中,每个对象都有一个内部锁(也称为监视器锁),`synchronized`关键字通过获取和释放这个锁来控制线程的访问。 - 当一个线程试图访问同步代码块时,它会检查锁是否已经被其他线程持有。 - 如果锁未被占用,...

    深入理解Java并发之synchronized实现原理.docx

    总结来说,synchronized是Java并发编程中的核心关键字,它通过互斥访问、可见性和锁的多种优化策略,为开发者提供了一种有效管理线程安全的方法。理解和掌握synchronized的工作原理,对于编写高效、可靠的多线程代码...

Global site tag (gtag.js) - Google Analytics