好像是将当前内存块中相关内容lock住,不让其他线程访问,直接该线程访问完毕,再unlock

解决方案 »

  1.   

    晕,是楼上的楼上的楼上whyxx(我也是新手)
      

  2.   

    是这样子的,线程在java当中一旦有关于临界区 问题的时候需要互斥的访问,这个时候java为每一个临界区放置一个lock,这个lock一旦发现有线程进入,则将lock分配给这个线程,其他的线程在当前线程退出临界区之前是不能够获得lock并进入临界区的。所以一旦你添加了sychronized后,所有的互斥要求都得到满足,不必再要求程序员编码完成了。
      

  3.   


    java里没有专门用于做互斥的工具类,而是采用一个关键字(synchronized)来实现互斥的功能。这与c/c++不太一样,c/c++中有专门的互斥函数或工具类,但是不同平台是不一样的,
    在Windows下是采用结构体CRITICAL_SECTION,及其相关的几个函数:
      1.InitializeCriticalSection,
      2.DeleteCriticalSection, 
      3.InitializeCriticalSection, 
      4.LeaveCriticalSection
    来实现。对于MFC这采用CMutex。
    在Linux采用结构体pthread_mutex_t,及其相关函数:
      1.pthread_mutex_init
      2.pthread_mutex_destroy
      3.pthread_mutex_lock
      4.pthread_mutex_unlock
    来实现。由此看来,c/c++中做互斥需要用到一个结构(或类)。
    但是java中却没有这样的类,表面上看是这样,其实不然,java里有这种类,就是java里所有类的父类:Object。
    在做互斥的时候synchronized后面需要加一个对象,这个对象可以看作是windows下的结构体CRITICAL_SECTION或Linux下的结构体pthread_mutex_t。可以这样来理解,在Object里加两个方法:lock和unlock,其功能分别为加锁和解锁。下面的代码:
      synchronized(obj){
      ...
      }
    可以转换成:
      obj.lock();
      ...
      obj.unlock();
    这样的话synchronized关键字就可以不要了。但是java里为了简化编程还是采用了synchronized关键字,而省略了Object的lock和unlock方法。