上篇博客没写好,排版改了好多次,看着实在头疼所以就没准备往下写了,今天讲下同步使用到的关键字synchronized,这个关键字可以是用在方法上,也可以使用再代码块上,
synchronized作用在方法上,它的锁对象是当前实例对象
public class SyncThreadTest implements Runnable{ private int ticker = 100; @Override public void run() { sale(); } /** * 同步在方法上 */ private synchronized void sale() { if(ticker>0) { for(int i=0;i<10;i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } Log.e("HAHAHA",Thread.currentThread().getName()+"在买第"+ticker--+"票"); } } } }启动10个线程去抢100张票
SyncThreadTest stt = new SyncThreadTest(); for(int i=0;i<10;i++){ new Thread(stt).start(); }这个锁对象其实就SyncThreadTest实例对象,
如果同步在代码块上:它的锁是任意对象
package com.test; import android.util.Log; /** * Created by admin on 2017/1/10. */ public class SyncThreadTest implements Runnable{ private int ticker = 100; @Override public void run() { sale(); } /** * 同步在方法上 */ private void sale() { synchronized(this){ if(ticker>0) { for(int i=0;i<10;i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } Log.e("HAHHA",Thread.currentThread().getName()+"在买第"+ticker--+"票"); } } } } }这是同步代码块,这个一定要注意代码块的范围,也就是那些该同步,那些不改同步,上面的同步代码块中使用的锁也是实例对象本身,
还有就是静态方法使用锁问题?
因为在静态方法中不能使用this作为锁对象,因此一般都使用类名.class作为锁对象,因为它在JVM加载的时候就被类加载器加载到内存中,
使用synchronized的前提条件
1:必须是多个线程抢占同一个资源
2:这个资源必须是成员属性,比如局部变量什么的可肯定不行
3:要想保持线程安全就必须使用锁对象要保持一致
线程安全的弊端
1:因为加入了锁机制,所以每次都必须去判断锁是否释放,这也是要消耗资源的,所以降低了效率