最近看到多线程这块。有很多疑问,请教各位:
1、java解决多线程是使用同步机制,即对象锁,使用synchronized同步代码块或者方法。但是框架也好,直接通过new创建对象也好。new Object以后就是一个新的对象。加入每个线程过来都是new Object()。感觉不需要synchronized进行同步。莫非同步只在单例等条件下适用?
2、同步方法氛围static和非static的同步方法有什么区别?
我们都知道static是属于类级别的方法。而看了一些资料,上面说static的同步方法,一个线程调用以后,其他线程都不能再调用。非static的方法是对象级别的,当该对象有一个线程调用他的非static同步方法后,其他线程必须等这个线程执行完成以后才能调用该非static同步方法。
3、一个对象内部,一个synchronized方法调用另外一个synchronized方法有没有问题。请各位指教哈。在线等。

解决方案 »

  1.   

    1.不太懂你描述的是什么,每个对象都有一个锁相对应,多个线程同时通过方法对一个对象的变量进行读写,就需要该方法是synchronized的
    2.static方法所拥有的锁是类的Class对象的锁
    3.可以的,锁是可重入的
      

  2.   


    第一个问题我是想问:如果我每个线程访问一个类的时候都是new一个对象。还需要同步吗?
    第二个问题:补充一下,static同步方法我知道是对Class的锁,但是如果一个类有一个static的同步和一个非static的同步,一个线程调用了static的同步方法,其他线程还能调用非static同步方法么?如果调用了非static的同步方法,其他线程还能调用static的同步方法?
    第三个问题:感谢回答,看了下确实是有重入的。
      

  3.   

    1.在对同一块内存区域进行读写的时候才需要有同步,因为锁是针对对象的,所以两个线程访问不同对象的方法,它们需要得到的锁也是不同的,这种情况下线程各自执行自己的方法,理论上不需要同步.但是设计方法API的时候要考虑线程同步性,就要多问一句:这个方法有没有可能被多个线程同时访问,如果访问了有没有对成员变量的读写工作,需不需要同步?2.一个线程调用了static同步方法,其他线程可以调用非static同步方法,因为锁是不同的
      

  4.   

    总而言之,你设计了一个API方法给其他人调用,你就决定不了对方是创建了多个线程调用这个方法,还是一个线程都new一个新对象来调用这个方法,所以这种情况下需不需要将方法设计为同步就得看你方法做了什么.