线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,
而无写操作,一般来说,这个全局变量是线程安全的;
若有多个线程同时执行写操作,一般都需要考虑线程同步,
否则的话就可能影响线程安全
public class Demo5Ticket { public static void main(String[] args) { //创建线程任务对象 Ticket ticket = new Ticket(); //创建三个窗口对象 Thread t1 = new Thread(ticket, "窗口1"); Thread t2 = new Thread(ticket, "窗口2"); Thread t3 = new Thread(ticket, "窗口3"); //卖票 t1.start(); t2.start(); t3.start(); } static class Ticket implements Runnable { // Object lock = new Object(); ReentrantLock lock = new ReentrantLock(); private int ticket = 10000; public void run() { String name = Thread.currentThread().getName(); while (true) { // synchronized (lock) { lock.lock(); sell(name); lock.unlock(); // } if (ticket <= 0) { break; } } } //private synchronized void sell(String name) { private void sell(String name) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } if (ticket > 0) { System.out.println(name + "卖票:" + ticket); ticket--; } } } }
当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,
就容 易出现线程安全问题。 要解决上述多线程并发访问一个资源的安全问题,
Java中提供了同步机制 (synchronized)来解决。
同步代码块
Object lock = new Object();
//创建锁
synchronized(lock){
//可能会产生线程安全问题的代码
}
同步方法
//同步方法
public synchronized void method(){
//可能会产生线程安全问题的代码
}