1. 程式人生 > >掌握Volatile關鍵字可見性的概念,模擬一個可見性的小場景

掌握Volatile關鍵字可見性的概念,模擬一個可見性的小場景

volatile的概念:Volatile關鍵字的主要作用是使變數在多個執行緒之間可見,使得在多執行緒之間可以進行變數的變更。

模擬的場景:新建一份課程科目資訊,當執行緒1新建一個課程後,執行緒2在新建的該課程下新增科目。

package com.bfxy.thread.core.mycollection;

import java.util.ArrayList;
import java.util.List;

public class MyVolatile {
    volatile  Courses courses = new Courses();//課程
    volatile  Integer a = 1;
    //新增課程
    public void addcourses(){
        courses.setCourses_id(1);
        courses.setCourses_name("託福");
    }
    //新增科目
    public void addsubjects(){
            Subject sub1 = new Subject();
            sub1.setSub_id(1);
            sub1.setSub_name("口語");
            Subject sub2 = new Subject();
            sub2.setSub_id(2);
            sub2.setSub_name("聽力");
            List<Subject> subjects = new ArrayList<Subject>();
            subjects.add(sub1);
            subjects.add(sub2);
            courses.setSubjects(subjects);
            a = 0;
    }

    public Courses getCourses() {
        return courses;
    }

    public void setCourses(Courses courses) {
        this.courses = courses;
    }

    public Integer getA() {
        return a;
    }

    public void setA(Integer a) {
        this.a = a;
    }

    public static  void main(String[] args){
        /**
         * 新建一份課程科目資訊,當執行緒1新建一個課程後,執行緒2在新建的該課程中新增科目。
         */
        MyVolatile myVolatile = new MyVolatile();

        //執行緒1新增課程
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                myVolatile.addcourses();
            }
        });
        //執行緒2新增科目
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (myVolatile.getA() == 1){//新增科目完成修改為0,迴圈結束  對a變數可見
                    if (myVolatile.getCourses().getCourses_id() != null && myVolatile.getCourses().getCourses_name() != null
                            && myVolatile.getCourses().getCourses_name() != ""){//判斷對課程實體類可見
                        myVolatile.addsubjects();
                    }else{
                        System.out.println("false");
                    }
                }
            }
        });
        t1.start();
        t2.start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //獲取新增後的結果
        if (myVolatile.getCourses() != null){
            System.out.println("課程id: "+myVolatile.getCourses().getCourses_id());
            System.out.println("課程name:"+myVolatile.getCourses().getCourses_name());
            if (myVolatile.getCourses().getSubjects() != null && myVolatile.getCourses().getSubjects().size()>0){
                for (Subject subject:myVolatile.getCourses().getSubjects()){
                    System.out.println("該課程下的科目id:"+subject.getSub_id());
                    System.out.println("該課程下的科目name:"+subject.getSub_name());
                }
            }
        }else{
            System.out.println("課程為空");
        }

    }
}

執行結果: