线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
线程同步(线程安全处理Synchronized)
方式1:同步代码块
方式2:同步方法
同步代码块
同步代码块: 在代码块声明上 加上synchronized
synchronized (锁对象) { 可能会产生线程安全问题的代码 }
同步代码块中的锁对象可以是任意的对象;但多个线程时,要使用同一个锁对象才能够保证线程安全。
同步方法
同步方法:在方法声明上加上synchronized
public synchronized void method(){ 可能会产生线程安全问题的代码 }
同步方法中的锁对象是 this
静态同步方法: 在方法声明上加上static synchronized
public static synchronized void method(){ 可能会产生线程安全问题的代码 }
静态同步方法中的锁对象是 类名.class
Lock接口
实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。
lock()获取锁 unlock()释放锁
使用Lock接口,以及其中的lock()方法和unlock()方法替代同步
public class Ticket implements Runnable { //共100票 int ticket = 100; //创建Lock锁对象 Lock ck = new ReentrantLock(); @Override public void run() { //模拟卖票 while(true){ //synchronized (lock){ ck.lock(); if (ticket > 0) { //模拟选坐的操作 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在卖票:" + ticket--); } ck.unlock(); //} } } }