android 线程 synchronized关键字

在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一些异常,例如threadInterruptedExcepti on等):
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。

你可能感兴趣的:(thread,android,异步)