static变量同步问题的疑惑

realcbb 2010-02-04 12:48:05
我的期望是在程序中保存一个类似于全局变量的对象,但要防止多线程访问时的冲突.这仿佛是一个非常基础的要求.
如果用static Map map = new HashMap();然后在访问的方法里用synchronized(map){处理map},这样能不能起到作用?
对于同步,我的理解是这样的:通常的synchronized用法是修饰方法或者块,作用于块的时候一般是synchronized(this)或者是synchronized(A.class)的形式,防止多线程同时访问this的所有同步方法或类A的所有static同步方法.但是synchronized(map)是不是就是不能多线程同时访问map呢?

另外,static变量的生命周期是怎样的,是JVM关闭才结束的吗?网上某些文章说static变量的生命周期随着类的生命周期消亡,那类的生命周期是什么样的呢?
...全文
138 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jc8futao 2010-02-04
  • 打赏
  • 举报
回复
synchronized(object)表示的就是对象已经被上锁,不能只有当前一个线程可以占有。但是这样做不好。因为上锁的对象虽然被上锁了,但是该对象的值也可以被改变。甚至引用也可以改变。改变引用之后,上锁的对象就不对了,并发的线程都可能出错。最好是用一个静态的fanil的变量表示锁
ChDw 2010-02-04
  • 打赏
  • 举报
回复
一个JVM中可以有非常多的ClassLoader

在Web应用服务器中,每个war通常都会新建一个ClassLoader来加载其中的类,这样可以避免互相冲突。
realcbb 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chdw 的回复:]
1、如果你所有访问map的地方都增加了synchronized(map),那么可以避免线程冲突。因为synchronized不是的作用就是必须先得到了对象锁以后再进入方法中,synchronized(map)就是请求map的锁,没有问题


2、类的生命周期主要是在类被卸载的时候,这个主要是由于加载这个类的ClassLoader被释放了之后发生的。
[/Quote]

谢谢!
ClassLoader被释放并不等于JVM结束是吗?一个JVM中可以有多个ClassLoader对吗?
要补一下ClassLoader了..
lgf11088 2010-02-04
  • 打赏
  • 举报
回复
JVM关闭 类的生命周期也结束了
xiaoskery 2010-02-04
  • 打赏
  • 举报
回复
学习
ChDw 2010-02-04
  • 打赏
  • 举报
回复
1、如果你所有访问map的地方都增加了synchronized(map),那么可以避免线程冲突。因为synchronized不是的作用就是必须先得到了对象锁以后再进入方法中,synchronized(map)就是请求map的锁,没有问题


2、类的生命周期主要是在类被卸载的时候,这个主要是由于加载这个类的ClassLoader被释放了之后发生的。
lp19890601 2010-02-04
  • 打赏
  • 举报
回复
JVM 关闭 ,类的生命周期结束,静态变量的 生命周期同样结束!

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧