在计算机操作系统中,并发在宏观上是指在同一时间段内,同时有多道程序在运行。 一个程序可以对应一个进程或多个进程,进程有独立的存储空间。一个进程包含一个或多个线程。线程堆空间是共享的,栈空间是私有的。同样,在一个进程中,宏观上有多个线程同时运行。(微观上在单cup系统中,同一时刻,只有一个程序在运行。)
基于以上原理,线程在并发运行时,对共享数据的操作存在数据同步问题。
1.基本概念
1.什么样的数据会被存储在线程共享空间堆里?
对象,当使用new 关键字创建一个对象时,这个对象就被存储在堆里。
2.并发问题:
以一个例子来说明:
创建测试类Test.java,测试类中有一个方法对变量sum加1操作,创建两个线程tA和tB分别执行这段代码:
1 public class Test { 2 private int sum = 0; 3 public void add(){ 4 try { 5 System.out.println("线程:"+Thread.currentThread().getName()+"执行加1开始,sum当前值为:"+sum); 6 Thread.sleep(2000);//这两秒代表对其他数据进行操作所耗费的时间 7 sum++; 8 System.out.println("线程:"+Thread.currentThread().getName()+"执行加1结束,sum的值为:"+sum); 9 } catch (InterruptedException e) { 10 // TODO Auto-generated catch block 11 e.printStackTrace(); 12 } 13 } 14 public static void main(String [] args){ 15 final Test test = new Test(); 16 Thread tA = new Thread(new Runnable() { 17 18 @Override 19 public void run() { 20 // TODO Auto-generated method stub 21 test.add(); 22 } 23 }); 24 Thread tB = new Thread(new Runnable() { 25 26 @Override 27 public void run() { 28 // TODO Auto-generated method stub 29 test.add(); 30 } 31 }); 32 tA.start(); 33 tB.start(); 34 } 35 }