我的期望是在程序中保存一个类似于全局变量的对象,但要防止多线程访问时的冲突.这仿佛是一个非常基础的要求. 
如果用static Map map = new HashMap();然后在访问的方法里用synchronized(map){处理map},这样能不能起到作用? 
对于同步,我的理解是这样的:通常的synchronized用法是修饰方法或者块,作用于块的时候一般是synchronized(this)或者是synchronized(A.class)的形式,防止多线程同时访问this的所有同步方法或类A的所有static同步方法.但是synchronized(map)是不是就是不能多线程同时访问map呢? 另外,static变量的生命周期是怎样的,是JVM关闭才结束的吗?网上某些文章说static变量的生命周期随着类的生命周期消亡,那类的生命周期是什么样的呢? 

解决方案 »

  1.   

    JVM 关闭 ,类的生命周期结束,静态变量的 生命周期同样结束!
      

  2.   

    1、如果你所有访问map的地方都增加了synchronized(map),那么可以避免线程冲突。因为synchronized不是的作用就是必须先得到了对象锁以后再进入方法中,synchronized(map)就是请求map的锁,没有问题
    2、类的生命周期主要是在类被卸载的时候,这个主要是由于加载这个类的ClassLoader被释放了之后发生的。
      

  3.   

    JVM关闭 类的生命周期也结束了
      

  4.   


    谢谢!
    ClassLoader被释放并不等于JVM结束是吗?一个JVM中可以有多个ClassLoader对吗?
    要补一下ClassLoader了..
      

  5.   

    一个JVM中可以有非常多的ClassLoader在Web应用服务器中,每个war通常都会新建一个ClassLoader来加载其中的类,这样可以避免互相冲突。
      

  6.   

    synchronized(object)表示的就是对象已经被上锁,不能只有当前一个线程可以占有。但是这样做不好。因为上锁的对象虽然被上锁了,但是该对象的值也可以被改变。甚至引用也可以改变。改变引用之后,上锁的对象就不对了,并发的线程都可能出错。最好是用一个静态的fanil的变量表示锁