在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。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. android上一些方法的区别和用法的注意事项
  5. android实现字体闪烁动画的方法
  6. Android中dispatchDraw分析
  7. 使用NetBeans搭建Android开发环境
  8. 浅析Android中的消息机制-解决:Only the original thread that cr
  9. Android四大基本组件介绍与生命周期

随机推荐

  1. android studio更新到1.5后遇到的问题
  2. android实现调用系统音乐播放器
  3. android 两点缩放字体
  4. 九宫格
  5. Android 2D绘图总结
  6. android WebView java与js相互调用
  7. EditText对行光标默认第一行问题
  8. Android 中的 R.class,减小 Apk 包大小
  9. Android支持的媒体格式
  10. android仿京东商城例子