掌握Volatile關鍵字可見性的概念,模擬一個可見性的小場景
阿新 • • 發佈:2018-12-20
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("課程為空"); } } }
執行結果: