java线程学习

来源:互联网 发布:信捷plc编程教学视频 编辑:程序博客网 时间:2024/06/05 06:31
 

/*
   需求:
      银行有一个金库。
   有两个储户分别存300元,每次存100元,存3次。
  目的:找出该程序存在的安全隐患,并解决存在的安全问题!!
 
  如何找问题:
   1.明确哪些代码是多线程运行代码。
   2、明确共享数据。
   3、明确多线程运行代码中哪些语句是操作共享数据的
  
  
   同步函数用的是哪一个锁呢?
    函数需要被对象调用,那么函数都有一个所属对象引用。就是this。
 所以同步函数使用的锁就是this.
 
 通过前面的卖票程序来验证。
 
 使用两个线程来买票。
 一个线程在同步函数中。
 一个线程在同步代码块中。
 都在执行卖票动作。
    参考视频: 多线程11天_12
 
 如过同步函数被静态修饰后,使用的锁是什么呢?
 
 通过验证发现不在是this,因为静态方法中不可以定义this。
 静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
 类名.class  该对象的类型是class
 
 静态的同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class
*/

class Bank
{
  Object obj=new Object();
    private int sum;
 
 /*  加锁的方法一: 代码块加锁
 public void add(int n)
 {
       synchronized(obj)   //加锁,如果不加锁就会出现 200 200 300 400 500 600的现象!!
    {
             sum+=n;
    try{Thread.sleep(10);}catch(Exception e){  System.out.println(e);} //冻结线程
    System.out.println("总金"+sum);
    }
 }
 
 */
 
 //加锁方法二: 方法加锁
 
 public synchronized void add(int n)
 {
     
             sum+=n;
    try{Thread.sleep(10);}catch(Exception e){  System.out.println(e);} //冻结线程
    System.out.println("总金"+sum);
   
 }
 
}

class Cus implements Runnable
{

   Bank b=new Bank();
   private void run()
   {
       for(int i=0;i<3;i++)
    {
        b.run(100);
    }
   }
}

class 线程笔记_锁
{
      public static void main(String[] args)
   {
     
     Cus c=new Cus();
    
     Thread t1=new Thread(c);
     Thread t2=new Thread(c);
     t1.start();
     t2.start();
  
   }
}

原创粉丝点击