1 synchronized(Object):同一个object对象
先上代码看看:SynchronizedDemo1类中 有这么一句代码Object object =new Object();
创建了一个全局的object变量。作为对象锁
新建了4个线程去执行方法,我们来看运行结果。
可以分析出来:当线程1抢到CPU时间片时,开始执行时synchronizedDemo1对象的test1方法时候,虽然test1方法体用synchronized同步块包起来的,但是其他线程比如Thread4就可以对synchronizedDemo1对象的非同步方法进行访问。
等到线程1执行完毕后,线程2抢到了CPU时间片,这时就执行方法体,此时不允许其他线程访问,直到访问结束,最后线程3抢到时间片执行。
线程执行顺序是抢到CPU时间片 抢占式的 也有可能线程3开始抢到CPU时间片
当有两个对象时候,这时发现有两个线程1和线程5对test1进行了访问,说明全局的object变量。作为对象锁和synchronized (this)锁的是当前对象。
synchronized(Object):不是同一个object对象
这种其实是达不到锁的效果的,可以看出来在同一时刻线程1和线程2都对test1方法进行了访问。这种就会存在线程不安全的。所以synchronized(object)这种一般final ObjectmDataLock =new Object();为final不可再次赋值改变的对象object。
2 synchronized(this) 同一个对象:
这种其实和synchronized(Object):同一个object对象 一样的
synchronized(this) 不同对象:
test1方法有线程1和线程5同时访问。
结论:synchronized(this)代码块是锁定实例化的对象,每个对象有其独立的对象锁,互不干扰。
当多个并发线程访问同一个对象的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
当一个线程访问对象的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该对象中的非
synchronized(this)同步代码块。
当一个线程访问对象的一个synchronized(this)同步代码块时,其他线程对对象中所有其他synchronized(this)同步代码块的访问将被阻塞。
synchronized方法 效果其实和synchronized(this)使用的同一把锁。效果一样的。
下面来看synchronized(class):
结论:synchronized(class)锁是对类的所有实例对象起作用 类锁
当一个对象访问test1时,只有另外线程4和线程8访问了这个对象的非同步代码块test3,并没有另一个对象调用test1方法,说明被类锁锁住了。起了作用了。
synchronized static方法:和synchronized(class)锁类似的。