zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
  • 相关阅读:
    Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等
    Spring Boot -- 认识Spring Boot
    大数据 -- Cloudera Manager(简称CM)+CDH构建大数据平台
    大数据 -- kafka学习笔记:知识点整理(部分转载)
    大数据 -- Hadoop集群环境搭建
    大数据 -- zookeeper和kafka集群环境搭建
    Java基础 -- 数组
    sbt spark2.3.1 idea打包Caused by: java.lang.ClassNotFoundException: scala.Product$class
    windows 安装python pip Could not install packages due to anEnvironmentError: [WinError 5] 拒绝访问
    博客园编辑数学公式的方法
  • 原文地址:https://www.cnblogs.com/luyang08/p/5949933.html
Copyright © 2011-2022 走看看