java多线程synchronized关键字详解:
1.对资源进行加锁,使得同一时间只有一个线程进行操作,同步用以就解决多线程同时访问可能出现的问题,当synchronized方法执行完成或发生异常,会自动释放锁。
2.多个方法的多线程情况,如果一个对象有多个Synchronized方法,某个时刻某个线程进入某个Synchronized方法,那么该方法没有执行完毕前,其他线程是无法访问该对象的任何synchronized方法
结论:当synchronized关键字修饰方法时,该方法叫同步方法,java中每个对象都有一个锁,或者叫做监视器,当一个线程访问某个对象的Synchronized方法,将该对象上锁,其他任何线程无法访问该对象synchronized方法直到执行完毕后或者出现异常,才会将该对象锁释放。
3.考虑静态的同步方法,当一个方法被synchronized和static修饰,非静态同步方法将对象上锁,静态方法不属于对象,属于类,它将这个方法所在类的class对象上锁
结论:如果每个synchronized方法是static,当线程访问方法,它锁的不是synchronized方法所在的对象而是Class对象,因此当线程分别访问同一个类两个对象的两个static和synchronized方法时,他执行的顺序也是一个线程先去执行方法,执行完毕才会另一个线程才开始执行。
4.synchronized块
synchronized(object){}
表示线程执行时将object对象上锁,当一个线程执行,将object对象锁住,另一个线程就不能执行对应的块了。可能方法只有几行代码涉及到线程同步问题所以synchronized块比synchronized方法更加细粒度地控制了多个线程的访问,只有synchronized块中不能同时被多个线程所访问,方法中其他语句仍可以被对象成所访问