• Synchronized 个人理解


     
    1.synchronized方法相当于synchronized(this)
         Synchronized 方法是锁的当前对象,同一个对象的2个synchronized方法被2个线程调用会发生阻塞;
    2.static synchronized方法相当于synchronized(this.class)
      static synchronized方法是锁当前对象的Class,被所有此类的实例共享,多个线程调用此类的static synchronized方法会发生阻塞
     
    package com.lly.base.syn;
    /**
     * synchronized阻塞测试
     * 1.synchronized方法相当于synchronized(this)
     *         Synchronized 方法是锁的当前对象,同一个对象的2个synchronized方法被2个线程调用会发生阻塞;
     * 2.static synchronized方法相当于synchronized(this.class) 
     *         static synchronized方法是锁当前对象的Class,被所有此类的实例共享,多个线程调用此类的static synchronized方法会发生阻塞
     * 
     * @author liuly
     *
     */
    public class SynchronizedTest {
    
        public static void main(String[] args) {
            Syn1 n1 = new Syn1();
            Syn1 n2 = new Syn1();
    //        
    //        /******两个线程会阻塞 (对象锁)**/    
    //        new Thread(()->{
    //            System.out.println("线程1 启动");
    //            n1.add1();
    //            
    //        }).start();
    //        
    //        new Thread(()->{
    //            System.out.println("线程2 启动");
    //            n1.add1();
    //            
    //        }).start();
    //        
    //        /******两个线程会阻塞 (对象锁)  add1 add2 锁定同一个对象n1**/    
    //        new Thread(()->{
    //            System.out.println("线程1 启动");
    //            n1.add1();
    //            
    //        }).start();
    //        
    //        new Thread(()->{
    //            System.out.println("线程2 启动");
    //            n1.add2();
    //            
    //        }).start();
    //        
    //        /******两个线程不会阻塞(static add3是类锁,而add2 是对象锁 ) **/    
    //        new Thread(()->{
    //            System.out.println("线程1 启动");
    //            n1.add2();
    //            
    //        }).start();
    //        
    //        new Thread(()->{
    //            System.out.println("线程2启动");
    //            n2.add3();
    //            
    //        }).start();
    //        /******两个线程不会阻塞(static add3是类锁,虽然不是一个对象,但都是锁定同一个Syn1.class ) **/    
    //        new Thread(()->{
    //            System.out.println("线程1 启动");
    //            n1.add3();
    //            
    //            }).start();
    //        
    //        new Thread(()->{
    //            System.out.println("线程2 启动");
    //            n2.add3();
    //            
    //        }).start();
            
        }
    }
    
    
    class Syn1{
        /*
         * 非静态方法一:add1 
         * 同一个对象的add1方法会与add2阻塞
         */
        public  synchronized void add1(){
            System.out.println("add1 begin");
            try {
                Thread.sleep(4000);
                System.out.println("add1 end");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        /*
         * 非静态方法一:add2 
         * 
         */
        public synchronized void  add2(){
            System.out.println("add2  begin");
            
            try {
                Thread.sleep(1000);
                System.out.println("add2 end");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        /*
         * 静态方法一:add3 
         * 所有的调用add3方法的线程都会阻塞
         * 
         * 注:add3不会与add1(or add2)阻塞
         */
        public static synchronized void  add3(){
            System.out.println("add3  begin");
            
            try {
                Thread.sleep(1000);
                System.out.println("add3 end");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    Mybatis基本用法--下
    Mybatis基本用法--中
    Mybatis基本用法--上
    Java规范推荐
    jquery、js获取页面高度宽度等
    linux ssh -l 命令运用
    div的onblur事件
    js获取url中的参数方法
    div内部元素居中
    oracle排序
  • 原文地址:https://www.cnblogs.com/luyang08/p/5949933.html
Copyright © 2020-2023  润新知