synchronized为什么只能锁对象

问题描述

synchronized(obj){ //}synchronized锁的是对象的引用,存放在栈中,为什么设计时不能锁基本类型,同样存放在栈中,在内存中占用资源。如果说基本类型超过作用域会释放等原因,可以定义静态变量。 问题补充:remoteJavaSky 写道

解决方案

刚刚查了下引用在java虚拟机中,每个对象和类在逻辑上都是和一个监视器相关联的。对于对象来说,相关联的监视器保护对象的实例变量。对于类来说,监视器保护类的类变量。(如果一个对象没有实例变量,或者一个类没有变量,相关联的监视器就什么也不监视。) 为了实现监视器的排他性监视能力,java虚拟机为每一个对象和类都关联一个锁。代表任何时候只允许一个线程拥有的特权。线程访问实例变量或者类变量不需锁。但是如果线程获取了锁,那么在它释放这个锁之前,就没有其他线程可以获取同样数据的锁了。(锁住一个对象就是获取对象相关联的监视器)类锁实际上用对象锁来实现。当虚拟机装载一个class文件的时候,它就会创建一个java.lang.Class类的实例。当锁住一个对象的时候,实际上锁住的是那个类的Class对象。一个线程可以多次对同一个对象上锁。对于每一个对象,java虚拟机维护一个加锁计数器,线程每获得一次该对象,计数器就加1,每释放一次,计数器就减 1,当计数器值为0时,锁就被完全释放了。简而言之,就是要对一个对象加锁,需要一个锁指向这个对象,锁有计数器,对这个对象进行监控。。。。。基本类型是不可能被指针指着的。。。。。
解决方案二:
同意asyty的回答。在Java中,设计可同步的变量时至少要考虑两点:1.需要有一个锁对象与之关联,在synchronized快或方法中的代码,JVM调用的时候,会尝试去获取被Synchronized 的对象或Class的lock。这样才能达到同步。2.在执行wait 或notify的时候,需要有一个与之关联的集合来保存这个对象的锁被lock了几次,unlock了几次,满足如可重入锁的需求。这也就和唤醒有关了因此在设计同步时,基本类型是很难达到同步需求的。即使可以,那么把基本类型设计的如此笨重,还要基本类型干么呢。这事设计的问题,而不是技术可不可以的问题吧
解决方案三:
哦 应该这么说 在JAVA里基本类型是不可能被多个引用指着的
解决方案四:
引用synchronized锁的是对象的引用,存放在栈中,为什么设计时不能锁基本类型,同样存放在栈中, 在内存中占用资源。如果说基本类型超过作用域会释放等原因,可以定义静态变量。JAVA中,所有的对象都是继承自Object,Object里面应该封装了锁机制所需要的其他的变量,这样才能使用wait() notify()这类需要锁的函数打个比方,你要对某个对象加互斥锁,这个对象必须得封装一个mutex互斥量来计数吧,学习过操作系统的人都有一些了解吧。。。。我猜Object这个类里应该与这种机制而基本类型是不可能封装这些锁变量的吧
解决方案五:
如果基本类型可以被锁,那么它就需要有一个锁对象与之关联(在方法执行的时候会获取或释放),还需要一个wait集合与之关联(wait,notify,notifyall使用)那这个基本类型还算是基本类型了吗?并且已经有了基本类型的包装了,这个不是问题了吧我想
解决方案六:
都说了 是通过对象的引用来锁了。。。。。。。。。基本类型没有引用吧 怎么锁。。。。

时间: 2024-09-14 23:01:24

synchronized为什么只能锁对象的相关文章

java同步关键词解释、synchronized、线程锁(Lock)

1.java同步关键词解释 21.1 synchronized synchronized是用来实现线程同步的!!!                      加同步格式:                    synchronized( 需要一个任意的对象(锁) ){                             代码块中放操作共享数据的代码.                    }          见代码MySynchronized package thread1;   publ

多态-java创建锁对象的问题

问题描述 java创建锁对象的问题 在创建锁对象是都是用Lock Lock=new ReentrantLock();以多态的方式. 我想问可以使用ReentrantLock Lock=new ReentrantLock()的方式创建锁吗?_ 解决方案 Java synchronized 关于锁的对象顺序问题JAVA创建String对象的问题JAVA创建String对象问题 解决方案二: 可以啊,只不过前一个是用基类类型赋给子类实例,后者直接是个子类类型. 解决方案三: 当然可以,前者是多态,后者

Java线程并发干扰问题及解决方式(锁对象)

并发干扰 使用多线程开发可以很好地提高代码效率,但是在多线程对同一数据资源的共享中,许多线程需要的同一个数据做读写修改操作,因此必然会存在竞争问题,而且这些问题通常会带来灾难性的后果,我们来看一个例子: 现在有一个多线程的银行账户管理系统,我的账户内有余额 1000 元,现在有两个线程对我的账户进行操作: 线程 A :存入500元 线程 B :取出200元 我们应该知道,在大多服务器操作系统中都采用抢占式调度(线程状态及属性),每个线程只有一个时间片来执行任务,当时间片用完后会立刻暂停运行交由其

Oracle官方并发教程之锁对象

原文地址,译文地址,译者:李任,校对:郑旭东 同步代码依赖于一种简单的可重入锁.这种锁使用简单,但也有诸多限制.java.util.concurrent.locks包提供了更复杂的锁.我们不会详细考察这个包,但会重点关注其最基本的接口,锁. 锁对象作用非常类似同步代码使用的隐式锁.如同隐式锁,每次只有一个线程可以获得锁对象.通过关联Condition对象,锁对象也支持wait/notify机制. 锁对象之于隐式锁最大的优势在于,它们有能力收回获得锁的尝试.如果当前锁对象不可用,或者锁请求超时(如

Java中的ReentrantLock和synchronized两种锁机制的对比

原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 -- synchronized 和 volatile.在简化与平台无关的并发类的开发的同时,它决没有使并发

java 线程锁对象锁的理解

《Java多线程编程核心技术》——2.1节synchronized同步方法

2.1 synchronized同步方法在第1章中已经接触"线程安全"与"非线程安全"相关的技术点,它们是学习多线程技术时一定会遇到的经典问题."非线程安全"其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是"脏读",也就是取到的数据其实是被更改过的.而"线程安全"就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象.此知识点在第1章也介绍,但本章将细化线程并发访问的内容,在

java 锁

什么是线程安全? 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的.代码本省封装了所有必要的正确性保障手段(互斥同步等),令调用者无需关心多线程的问题,更无需自己实现任何措施来保证多线程的正确调用. 如何来实现线程安全? 我们应用最多的就是互斥锁: java的互斥锁的主要有synchronized,和JUC 中的lock两种: 加锁的原理是 对象

jvm(13)-线程安全与锁优化(转)

0.1)本文部分文字转自"深入理解jvm", 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概述 [2]线程安全 1)线程安全定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的:(干货--线程安全定义) [2.1]java 语言中的线程安全(干货-