同步(synchronized)基本概念

同步(synchronization):线程交叉(thread interference)、内存一直性(memory consistency)、同步方法(synchronized method)、内在锁(Intrinsic Locks)、原子性(atomic access)

线程交叉:如两个线程分别对一个对象的int a=0;执行a++和a—操作,则可能导致a=1或-1或0。因为a++和a—操作都是非原子的,可以拆解为多个步骤,所以a在加完后,没把值放回内存之前,a发生减一操作,那么a的值就会是1或-1.

内存一致性:a线程创建b线程之前执行的操作,对b线程来说是可见的;a线程创建b线程后,执行b.join(),那么a线程之后的代码,得到了b线程执行的后果。

同步方法:synchronized加在public之后,代表此方法是同步方法,当一线程访问某对象的某个同步方法(非静态)时,给该对象加了锁,别的线程就无法调用该对象的任一同步方法,但并不影响调用其它非同步方法。

内在锁:内在锁即指某个线程从获取该对象到失去该对象访问权限的期间。静态方法的锁确是能够影响该类的所有对象。同步代码块:可以使多个线程访问一个对象中的某个同步代码块时,只能挨个执行,多个线程可以同时执行同步代码块外其他代码(如同步代码块所在方法的非同步代码)。同步代码块有一定应用场景:如类A中有两个对象成员变量B,C,2个线程可以同时一个访问B、一个访问C,但是不能同时2个都访问B或2个都访问C。那么可以利用如下代码实现:

class A{

B b = new B();

C c = new C();

public void increaseB(){

synchronized(b){

…}

}

public void increaseC(){

synchronized(c){

}

}

}

如此以来访问b时(执行increaseB),锁住的是b对象,那么并不影响访问c(执行increaseC)

原子性:读写任一基本类型都是原子操作(long和double除外);读写任一volatile修饰的基本类型都是原子操作