- 开启多线程时,每一个线程都拥有自己的工作空间,每个工作空间都单独的和主存打交道。
- 并发的概念:多个线程同时操作同一个对象
- 当产生并发时,如果从工作空间写入数据到内存的线程时间片用完了,其他线程再从主存读数据就会形成数据不统一。(只会在写数据时出现问题,简单的读数据是不会出现问题的)比如:教室里面只有一台电脑,大家都去使用,第一个同学使用后(时间片用完了)但是自己的任务还没完成,数据还没取出来,第二个同学也把自己的数据存在电脑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