一 关于synchronized(this)同步代码块
当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,同一时间只能有一个进程执行该代码块。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。并且其他线程对于object中所有其他的synchronized(this)同步代码块的访问被阻塞。也就是说其他所有需要得到该实例对象(注意,是该实例对象)锁的线程都将被阻塞,一直到该线程释放该实例对象的锁后,才能执行。但是,在某个线程访问object的一个synchronized(this)同步代码块时,其他线程可以通过其他非synchronized的方法来访问该object访问该object中非synchronized(this)同步代码块的内容。
二 关于static synchronized的同步问题
由于用了static来修饰该方法,由static的知识可以知道,static是不用实例化对象就存在的,所以,说明该代码块无论是该对象的哪个实例调用,只要是一个程序中的,那么调用该块的时候,都将受到一个锁的限制,这个锁是类的锁,而不是对象的锁,同上一个概念相比所不一样的地方就是,如果两个线程对于不同的对象调用,那么相互之间不影响,而这里,不管你是哪个对象,调用该同步块的时候,都只有一个锁,一个程序中,只能允许一个进程执行,其他进程都将被阻塞。同时要注意的是,类锁与实例锁不是一个锁,也就是说,如果某线程得到了一个类锁,其他进程得到了该对象的实例锁子,两个线程并不相互影响。同实例锁一样,如果类锁被某线程得到,其他线程调用非同步块的内容,不会被阻塞。
当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,同一时间只能有一个进程执行该代码块。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。并且其他线程对于object中所有其他的synchronized(this)同步代码块的访问被阻塞。也就是说其他所有需要得到该实例对象(注意,是该实例对象)锁的线程都将被阻塞,一直到该线程释放该实例对象的锁后,才能执行。但是,在某个线程访问object的一个synchronized(this)同步代码块时,其他线程可以通过其他非synchronized的方法来访问该object访问该object中非synchronized(this)同步代码块的内容。
二 关于static synchronized的同步问题
由于用了static来修饰该方法,由static的知识可以知道,static是不用实例化对象就存在的,所以,说明该代码块无论是该对象的哪个实例调用,只要是一个程序中的,那么调用该块的时候,都将受到一个锁的限制,这个锁是类的锁,而不是对象的锁,同上一个概念相比所不一样的地方就是,如果两个线程对于不同的对象调用,那么相互之间不影响,而这里,不管你是哪个对象,调用该同步块的时候,都只有一个锁,一个程序中,只能允许一个进程执行,其他进程都将被阻塞。同时要注意的是,类锁与实例锁不是一个锁,也就是说,如果某线程得到了一个类锁,其他进程得到了该对象的实例锁子,两个线程并不相互影响。同实例锁一样,如果类锁被某线程得到,其他线程调用非同步块的内容,不会被阻塞。