线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无操作,一般来说,这个全局变量是线程安全的。
若有多个线程同时执行写操作,一般都需要考虑线程同步, 否则的话就可能影响线程安全。
synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。
锁对象 可以是任意类型。多个线程对象,要使用同一把锁。在任何时候,最多运行一个线程拥有同步锁,谁拿到锁就进入代码块,其他线程只能等待。
一、同步代码块
//语法格式 synchronized(同步锁){ //需要同步操作的代码 } //示例 private int cont = 100; Object obj = new Object(); @Override public void run(){ synchronized(obj){ //被锁住的代码 while(cont>0){ //线程休眠10毫秒 try{ Thread.sleep(10); }catch(Exceptione){ System.out.println(e.getMessage()); } System.out.println(Thread.currentThread().getName()+"正在抢第"+cont+"票"); cont--; } } }
二、同步方法
public synchronized void method(){ //可能会产生线程安全问题的代码 }
三、锁(Lock)机制
public class DemoRunnableImpl implements Runnable { private int cont = 100; Lock lock=new ReentrantLock();//创建一个ReentrantLock对象 @Override public void run() { lock.lock();//获取锁 while (cont > 0) { //线程休眠10毫秒 try { Thread.sleep(10); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.println(Thread.currentThread().getName() + "正在抢第" + cont + "票"); cont--; } lock.unlock();//释放锁 } }