java多线程浅谈

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

分这几种情况:
    1.其他方法前是否加了synchronized关键字,如果没加,则能。
    2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
    3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
    4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。 

为什么有这么多情况呢?这是由于java对象的锁机制引起的,java实现多线程是通过对象锁来实现的,一个对象只有一个锁,所以不管多少个线程调用一个对象中的方法,有且只有一个线程能够拥有该对象的锁,当一个线程调用这个对象的synchronized方法时,该对象即占用了该对象的锁,所以出现上面几种情况。

在简答的说一下java中关于线程同步问题

1、jvm内存的划分 :jvm简单的可以划分为:方法区、堆和栈 。方法区存放jvm初始化类的信息,类的Class类,静态方法与静态变量,方法区是为所有线程所共享的;堆中存放类实例化出的类的对象的信息,堆中的数据也是所有线程共享的。那么栈呢,jvm为每一线程创建一个栈,栈中的信息是相互独立的,所以即使多个线程同时执行一个对象的一个方法,方法中的局部变量也不会出现信息不一致问题。

参见http://blog.csdn.net/kyfg27_niujin/article/details/7942006

原文地址:https://www.cnblogs.com/yidaxia/p/4086085.html