牛骨文教育服务平台(让学习变的简单)
博文笔记

android 线程 synchronized关键字

创建时间:2015-05-01 投稿人: 浏览次数:800
在android中为了提高更好的运行效果,免不了用到一些线程,当然更加免不了学习一些线程之间同步异步的知识,所以更加免不了学习获得锁之类的一些知识,这里就用到了synchronized关键字。 1.sychronized在方法中: 例:void func(){       // code segment A               synchronized(object){                     //code segment B               }              // code segment C        } 当不同的线程都执行func方法时,在执行完code segment A之后,线程们都要去获得object对象的锁,但是只有一个线程可以获得,而其他未获得锁的线程需要等待,等到获得锁的线程执行完code segment B之后,该线程会自动释放该对象锁(synchronized关键字与lock不一样,lock需要有显式的释放锁和获得锁的语句,但是对于sychronized关键字,当线程执行到该代码块时就会隐式的得到锁,当执行完code segment B之后就会隐式的释放锁,这里不多做解释。),然后刚刚等待该对象锁线程会去努力获得该锁,完成自己线程所需完成的任务。
2.synchronized修饰方法。 这里分两种来说明,一种是static方法和非static方法。 static方法:如果有线程执行synchronized static 方法,那么会得到该类的锁。 非static方法:如果有线程执行synchronized 方法,那么会得到该对象的锁。 举个例子(这里需要读者注意的是不要直接复制代码,因为这里纯手写,复制之后还需要去catch一些异常,例如threadInterruptedException等): class A{ public synchronized void fun1(){ system.out.println("before fun1");         thread.sleep(1000);         system.out.println("after fun1"); }
public synchronized void fun2(){ system.out.println("before fun2");         thread.sleep(1000);         system.out.println("after fun2"); }
public synchronized static void fun3(){ system.out.println("before fun3");         thread.sleep(1000);         system.out.println("after fun3"); }
public synchronized static void fun4(){ system.out.println("before fun4");         thread.sleep(1000);         system.out.println("after fun4"); }
} 现在声明两个A对象a1和a2. 假设当前有两个线程t1和t2。两个thread分别执行以下的代码。 说明:(a1+1)+(a1+2):t1执行a1.fun1(); t2执行a1.fun2();    T表示两线程可以同时执行,F表示两线程不可以同时执行。 (a1+1)+(a1+2) *************F(因为两个函数都需要得到对象锁,但锁只有一个,所以不能同时。) (a1+1)+(a1+3) *************T(fun1()是获取对象锁,fun3()是获得类的锁,两个锁不一样,可以同时执行) (a1+3)+(a1+3) *************F(因为两个函数都需要得到类的锁,但锁只有一个,所以不能同时。) (a1+3)+(a1+4) *************F(因为两个函数都需要得到类的锁,但锁只有一个,所以不能同时。)
(a1+1)+(a2+1) *************T(a1.fun1()需要a1的锁,a2.fun1()需要a2的对象锁,两个锁不一样,可同时) (a1+1)+(a2+2) *************T(a1.fun1()需要a1的锁,a2.fun2()需要a2的对象锁,两个锁不一样,可同时) (a1+1)+(a2+3) *************T(a1.fun1()需要a1的锁,a2.fun3()需要类的锁,两个锁不一样,可同时) (a1+3)+(a2+3) *************F(因为两个函数都需要得到类的锁,但锁只有一个,所以不能同时。) (a1+3)+(a2+4) *************F(因为两个函数都需要得到类的锁,但锁只有一个,所以不能同时。)
(a1+1)+(A+3)*************T(a1.fun1()需要a1的锁,A.fun3()需要类的锁,两个锁不一样,可同时) (a1+3)+(A+3) *************F(因为两个函数都需要得到类的锁,但锁只有一个,所以不能同时。)   (A+3)+ (A+4) *************F(因为两个函数都需要得到类的锁,但锁只有一个,所以不能同时。) (A+3)+ (A+3) *************F(因为两个函数都需要得到类的锁,但锁只有一个,所以不能同时。)
看完这么多就应该知道synchronized怎么用了吧。 如果有问题,请踊跃指出,thx. 最后再给出一道面试题: 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 分几种情况: 1. 其他方法前是否加了synchronized关键字,如果没加,则能。 2. 如果这个方法内部调用了wait,则可以进入其他synchronized方法。 3. 如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。 4. 如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。