Java多线程学习——知识点积累

  1. 开启多线程时,每一个线程都拥有自己的工作空间,每个工作空间都单独的和主存打交道。
  2. 并发的概念:个线程同时操作同一个对象
  3. 当产生并发时,如果从工作空间写入数据到内存的线程时间片用完了,其他线程再从主存读数据就会形成数据不统一。(只会在写数据时出现问题,简单的读数据是不会出现问题的)比如:教室里面只有一台电脑,大家都去使用,第一个同学使用后(时间片用完了)但是自己的任务还没完成,数据还没取出来,第二个同学也把自己的数据存在电脑C盘的同一个文件(和第一个同学一样)里面,这样就会导致数据不一致,当第一个同学再回来用,就会发现问题;
  4. 使用synchronized同步方法或者同步块时注意锁住的对象,看一下锁住的方法或者块属于哪个对象,相应的对象就被锁住了。
  5. ArrayList是线程不安全的,CopyOnWriteArrayList是线程安全的。
  6. 有关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

 

posted @ 2019-06-29 20:20  一转身已万水千山  阅读(190)  评论(0编辑  收藏  举报