同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁,很明显,同步方法锁的范围比较大,而同步代码块范围要小点,一般同步的范围越大,性能就越差,一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好。
synchronized methods(){} 与synchronized(this){}之间没有什么区别,只是 synchronized methods(){} 便于阅读理解。
而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率, 它的作用域是当前对象。
Synchronized 方法控制对类成员的访问:每个类实例对应一把锁,每个synchronized方法都必须获得调用该方法的实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保同一时刻对于每一个实例,其所声明为synchronized的成员函数中至多只有一个处于可执行的状态(因为至多只有一个能够获得该实例对应的锁),从而有效的避免了类成员变量的访问冲突。
当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞
同步代码块是并发的时候锁定一个代码块只能一个线程占用,同步方法是对方法的锁定,如果能同步代码块尽量不要同步方法,否则影响效率