android 线程 synchronized关键字
16lz
2022-08-06
在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。
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。
更多相关文章
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用
- python list.sort()根据多个关键字排序的方法实现
- android上一些方法的区别和用法的注意事项
- android实现字体闪烁动画的方法
- Android中dispatchDraw分析
- 使用NetBeans搭建Android开发环境
- 浅析Android中的消息机制-解决:Only the original thread that cr
- Android四大基本组件介绍与生命周期