java第二階段學習day3.2

 

用線程寫一個3我的往同一張卡里存錢 每一個人存3次 一次存100 存完打印出錢的數目安全

---------------------
public class Synchronization {
 public static void main(String[] args) {
  MySynchroniza ms1 = new MySynchroniza();
  ms1.setName("張三");
  ms1.start();
  MySynchroniza ms2 = new MySynchroniza();
  ms2.setName("王五");
  ms2.start();
  MySynchroniza ms3 = new MySynchroniza();
  ms3.setName("李四");
  ms3.start();
 }
}
class MySynchroniza extends Thread{
 public static int sum = 0;
 @Override
 public void run() {
  for(int i = 0;i<3;i++){
 
  sum = sum + 100;
  System.out.println(Thread.currentThread().getName() + ":" + sum);
  }
 }
 
}ide


結果
王五:200
王五:400
王五:500
李四:300
李四:600
李四:700
張三:200
張三:800
張三:900
         這時候會出現 線程的安全問題 由於 CPU分配權 誰搶到 誰執行 有些線程 搶到了 可是
還沒執行完 一段 代碼 另一個線程 就搶先執行完了本身的代碼 因此出現了 線程 不安全問題this

這時就 引入 線程的同步來解決這個 安全問題線程

------------------------------------------------繼承

第一種
      把線程共享的代碼 放到synchronized裏 而後上鎖(全部線程用同一把鎖,
鎖不一樣就會在出現安全問題) 一個線程執行完了另一個線程 才能進來get


public class Synchronization {
 public static void main(String[] args) {
  MySynchroniza ms1 = new MySynchroniza();
//給線程設置名字
  ms1.setName("張三");
  ms1.start();
  MySynchroniza ms2 = new MySynchroniza();
  ms2.setName("王五");
  ms2.start();
  MySynchroniza ms3 = new MySynchroniza();
  ms3.setName("李四");
  ms3.start();
 }
}
//繼承
class MySynchroniza extends Thread{
 public static int sum = 0;
 public static Object obj = new Object();
 @Override
 public void run() {
  for(int i = 0;i<3;i++){
    synchronized (obj) {
 
 sum = sum + 100;
 System.out.println(Thread.currentThread().getName() + ":" + sum);
  }
  }
 }
 
}
---------------------------------------同步

第二種io

public class Synchronization3 {class

 public static void main(String[] args) {
  MyThread6 m1 = new MyThread6();
  Thread t1 = new Thread(m1);
  t1.setName("zhangsan");
  t1.start();
  
  Thread t2 = new Thread(m1);
  t2.setName("lisi");
  t2.start();
  
  Thread t3 = new Thread(m1);
  t3.setName("wangwu");
  t3.start();
  
 }
}
class MyThread6 implements Runnable{thread

 private int sum = 0;
 @Override
 public void run() {
  for(int i = 0;i<3;i++){
//this 爲只new了一次 的 MyThread6 的引用 若是new屢次 鎖就會有多把 就不能用this
   synchronized (this) {
   sum = sum + 100;
System.out.println(Thread.currentThread().getName() + ":" + sum);
   }
  }
  
 }
 
}

--------------------------------
第三種 synchronized 方法
                把共享代碼 放進synchronized 聲明的方法裏


public class Synchronizwtion2 {

 public static void main(String[] args) {
  MyThread5 mythread = new MyThread5();
  Thread thread = new Thread(mythread);
  Thread thread2 = new Thread(mythread);
  Thread thread3 = new Thread(mythread);
  thread.setName("張三");
  thread2.setName("李四");
  thread3.setName("王五");
  
  thread.start();
  thread2.start();
  thread3.start();
 }
}
class MyThread5 implements Runnable {

 public int sum = 0; @Override public void run() {  for(int i = 0 ;i<3;i++){   sync();  }   }  public synchronized void sync(){sum = sum + 100;System.out.println(Thread.currentThread().getName() + "當前存了100,現有:" + sum); }}

相關文章
相關標籤/搜索