在Java中,每个对象都拥有一个锁标记(monitor),也称为监视器,多线程同时访问某个对象时,线程只有获取了该对象的锁才能访问。安全
在Java中,可使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时,这个线程便得到了该对象的锁,其余线程暂时没法访问这个方法,只有等待这个方法执行完毕或者代码块执行完毕,这个线程才会释放该对象的锁,其余线程才能执行这个方法或者代码块。多线程
1)当一个线程正在访问一个对象的synchronized方法,那么其余线程不能访问该对象的其余synchronized方法。这个缘由很简单,由于一个对象只有一把锁,当一个线程获取了该对象的锁以后,其余线程没法获取该对象的锁,因此没法访问该对象的其余synchronized方法。并发
2)当一个线程正在访问一个对象的synchronized方法,那么其余线程能访问该对象的非synchronized方法。这个缘由很简单,访问非synchronized方法不须要得到该对象的锁,假如一个方法没用synchronized关键字修饰,说明它不会使用到临界资源,那么其余线程是能够访问这个方法的,spa
3)若是一个线程A须要访问对象object1的synchronized方法fun1,另一个线程B须要访问对象object2的synchronized方法fun1,即便object1和object2是同一类型),也不会产生线程安全问题,由于他们访问的是不一样的对象,因此不存在互斥问题。线程
另外,每一个类也会有一个锁,它能够用来控制对static数据成员的并发访问。对象
而且若是一个线程执行一个对象的非static synchronized方法,另一个线程须要执行这个对象所属类的static synchronized方法,此时不会发生互斥现象,由于访问static synchronized方法占用的是类锁,而访问非static synchronized方法占用的是对象锁,因此不存在互斥现象。资源
有一点要注意:对于synchronized方法或者synchronized代码块,当出现异常时,JVM会自动释放当前线程占用的锁,所以不会因为异常致使出现死锁现象。it