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); }}

相关文章
相关标签/搜索