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


结果
王五:200
王五:400
王五:500
李四:300
李四:600
李四:700
张三:200
张三:800
张三:900
         这时候会出现 线程的安全问题 因为 CPU分配权 谁抢到 谁执行 有些线程 抢到了 但是
还没执行完 一段 代码 另外一个线程 就抢先执行完了自己的代码 所以出现了 线程 不安全问题

这时就 引入 线程的同步来解决这个 安全问题

------------------------------------------------

第一种
      把线程共享的代码 放到synchronized里 然后上锁(所有线程用同一把锁,
锁不同就会在出现安全问题) 一个线程执行完了另外一个线程 才能进来


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

第二种

public class Synchronization3 {

 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{

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

 

你可能感兴趣的:(线程的同步)