同步(synchronized)基本概念

  1. 同步(synchronization):线程交叉(thread interference)、内存一直性(memory consistency)、同步方法(synchronized method)、内在锁(Intrinsic Locks)、原子性(atomic access)
  2. 线程交叉:如两个线程分别对一个对象的int a=0;执行a++和a—操作,则可能导致a=1或-1或0。因为a++和a—操作都是非原子的,可以拆解为多个步骤,所以a在加完后,没把值放回内存之前,a发生减一操作,那么a的值就会是1或-1.
  3. 内存一致性:a线程创建b线程之前执行的操作,对b线程来说是可见的;a线程创建b线程后,执行b.join(),那么a线程之后的代码,得到了b线程执行的后果。
  4. 同步方法:synchronized加在public之后,代表此方法是同步方法,当一线程访问某对象的某个同步方法(非静态)时,给该对象加了锁,别的线程就无法调用该对象的任一同步方法,但并不影响调用其它非同步方法。
  5. 内在锁:内在锁即指某个线程从获取该对象到失去该对象访问权限的期间。静态方法的锁确是能够影响该类的所有对象。同步代码块:可以使多个线程访问一个对象中的某个同步代码块时,只能挨个执行,多个线程可以同时执行同步代码块外其他代码(如同步代码块所在方法的非同步代码)。同步代码块有一定应用场景:如类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)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章