- 开启多线程时,每一个线程都拥有自己的工作空间,每个工作空间都单独的和主存打交道。
- 并发的概念:多个线程同时操作同一个对象
- 当产生并发时,如果从工作空间写入数据到内存的线程时间片用完了,其他线程再从主存读数据就会形成数据不统一。(只会在写数据时出现问题,简单的读数据是不会出现问题的)比如:教室里面只有一台电脑,大家都去使用,第一个同学使用后(时间片用完了)但是自己的任务还没完成,数据还没取出来,第二个同学也把自己的数据存在电脑C盘的同一个文件(和第一个同学一样)里面,这样就会导致数据不一致,当第一个同学再回来用,就会发现问题;
- 使用synchronized同步方法或者同步块时注意锁住的对象,看一下锁住的方法或者块属于哪个对象,相应的对象就被锁住了。
- ArrayList是线程不安全的,CopyOnWriteArrayList是线程安全的。
- 有关wait方法,wait方法和sleep最大的不同是wait方式释放当前对象的锁,并且wait要在同步块或者同步方法中使用,调用了该线程会处于等待状态,然后释放资源,其他拥有该对象的线程可以继续执行同步块或者同步方法(wait释放资源)。如下例子:
public class Main{ public static void main(String args[]) { Output output=new Output(); new TestWait(output,"张三").start(); new TestWait(output,"李四").start(); } } class TestWait extends Thread{ private Output output; public TestWait(Output output,String name){ super(name); this.output=output; } @Override public void run() { output.output(); } } class Output{ public synchronized void output(){ for (int i = 0; i < 10; i++) { if(Thread.currentThread().getName().equals("张三") && i==3){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+i); if(i==9){ this.notifyAll(); } } } }
张三0
张三1
张三2
李四0
李四1
李四2
李四3
李四4
李四5
李四6
李四7
李四8
李四9
张三3
张三4
张三5
张三6
张三7
张三8
张三9