• java并发(二):初探syncronized


    参考博客

    Java多线程系列--“基础篇”04之 synchronized关键字

    synchronized基本规则

    第一条 当线程访问A对象的synchronized方法和同步块的时候,其他线程无法访问A对象的synchronized方法和同步块
    第二条 当线程访问A对象的synchronized方法和同步块的时候,其他线程可以访问A对象的非synchronized方法和同步块
    第三条 当线程访问A对象的synchronized方法和同步块的时候,其他线程不可以访问A对象其他synchronizedd方法和同步块

    第三条基本原则测试

    
    
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    public class SysDemo3 {
        public static void main(String[] args) {
            final  Count count =new Count();
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    count.synMethodA();
                }
            },"t1");
            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    count.synMethodB();
                }
            },"t2");
            t1.start();
            t2.start();
        }
    
    
    }
    @Slf4j
    class Count {
        int countsize =5;
    
        public synchronized void synMethodA(){
            int count =0;
            while(count<countsize){
                log.info("synMethodA, Current thread is : {}, count = {}",Thread.currentThread().getName(),count++);
            }
    
        }
        public synchronized void synMethodB(){
            int count =0;
            while(count<countsize){
                log.info("synMethodB, Current thread is : {}, count = {}",Thread.currentThread().getName(),count++);
            }
    
        }
    }
    
    

    测试结果

    2019-07-25 13:40:44,482   [t1] INFO  Count  - synMethodA, Current thread is : t1, count = 0
    2019-07-25 13:40:44,482   [t1] INFO  Count  - synMethodA, Current thread is : t1, count = 1
    2019-07-25 13:40:44,482   [t1] INFO  Count  - synMethodA, Current thread is : t1, count = 2
    2019-07-25 13:40:44,482   [t1] INFO  Count  - synMethodA, Current thread is : t1, count = 3
    2019-07-25 13:40:44,482   [t1] INFO  Count  - synMethodA, Current thread is : t1, count = 4
    2019-07-25 13:40:44,482   [t2] INFO  Count  - synMethodB, Current thread is : t2, count = 0
    2019-07-25 13:40:44,482   [t2] INFO  Count  - synMethodB, Current thread is : t2, count = 1
    2019-07-25 13:40:44,482   [t2] INFO  Count  - synMethodB, Current thread is : t2, count = 2
    2019-07-25 13:40:44,482   [t2] INFO  Count  - synMethodB, Current thread is : t2, count = 3
    2019-07-25 13:40:44,482   [t2] INFO  Count  - synMethodB, Current thread is : t2, count = 4
    

    说明

    每个对象都有一把同步锁,同步锁是依赖对象存在的。上面的结果说明当A对象的同步方法或者同步块被调用的时候,这把锁
    就在使用者中,其他的使用者调用A对象的同步方法或者同步块的时候,是不会获取到锁的。

    实例锁与全局锁

    实例锁是锁在对象上
    全局锁是锁在类上,static syncronized方法或者同步块

    不同的线程调用一个类的不同的static syncronized方法。

    不同的线程调用一个类的不同的static syncronized方法:x.classSyn1()与y.classSyn2(),x不释放,y是无法运行静态同步方法的。

    测试

    
    import lombok.extern.slf4j.Slf4j;
    
    import static java.lang.Thread.sleep;
    /*
        全局锁的使用,类的static syncronized方法或代码块被线程调用,
        其他线程没有拥有全局锁,无法调用其他的同步方法和同步块
     */
    @Slf4j
    public class SysDemo5 {
        static  class Count {
            static int countsize =5;
    
            public synchronized void synMethodA(){
                int count =0;
                while(count<countsize){
                    log.info("synMethodA, Current thread is : {}, count = {}",Thread.currentThread().getName(),count++);
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
            }
            public synchronized void synMethodB(){
                int count =0;
    
                while(count<countsize){
                    log.info("synMethodB, Current thread is : {}, count = {}",Thread.currentThread().getName(),count++);
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
            }
            public static synchronized  void cSynMethodA(){
                int count =0;
                while(count<countsize){
                    log.info("class synMethodA, Current thread is : {}, count = {}",Thread.currentThread().getName(),count++);
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            public static synchronized  void cSynMethodB(){
                int count =0;
                while(count<countsize){
                    log.info("class synMethodB, Current thread is : {}, count = {}",Thread.currentThread().getName(),count++);
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        public static void main(String[] args) {
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    Count.cSynMethodA();
                }
            },"t1");
            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                   Count.cSynMethodB();
                }
            },"t2");
            t1.start();
            t2.start();
        }
    }
    

    测试结果

    2019-07-25 17:31:24,358   [t1] INFO  SysDemo5  - class synMethodA, Current thread is : t1, count = 0
    2019-07-25 17:31:24,857   [t1] INFO  SysDemo5  - class synMethodA, Current thread is : t1, count = 1
    2019-07-25 17:31:25,356   [t1] INFO  SysDemo5  - class synMethodA, Current thread is : t1, count = 2
    2019-07-25 17:31:25,855   [t1] INFO  SysDemo5  - class synMethodA, Current thread is : t1, count = 3
    2019-07-25 17:31:26,354   [t1] INFO  SysDemo5  - class synMethodA, Current thread is : t1, count = 4
    2019-07-25 17:31:26,853   [t2] INFO  SysDemo5  - class synMethodB, Current thread is : t2, count = 0
    2019-07-25 17:31:27,351   [t2] INFO  SysDemo5  - class synMethodB, Current thread is : t2, count = 1
    2019-07-25 17:31:27,850   [t2] INFO  SysDemo5  - class synMethodB, Current thread is : t2, count = 2
    2019-07-25 17:31:28,349   [t2] INFO  SysDemo5  - class synMethodB, Current thread is : t2, count = 3
    2019-07-25 17:31:28,847   [t2] INFO  SysDemo5  - class synMethodB, Current thread is : t2, count = 4
    

    x.classSyn1与x.sysn1

    对象的同步方法和类的同步方法互不影响

    测试

    import lombok.extern.slf4j.Slf4j;
    
    import static java.lang.Thread.sleep;
    
    @Slf4j
    public class SysDemo4 {
        static  class Count {
            static int countsize =5;
    
            public synchronized void synMethodA(){
                int count =0;
                while(count<countsize){
                    log.info("synMethodA, Current thread is : {}, count = {}",Thread.currentThread().getName(),count++);
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
            }
            public synchronized void synMethodB(){
                int count =0;
    
                while(count<countsize){
                    log.info("synMethodB, Current thread is : {}, count = {}",Thread.currentThread().getName(),count++);
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
    
            }
            public static synchronized  void cSynMethodA(){
                int count =0;
                while(count<countsize){
                    log.info("class synMethodA, Current thread is : {}, count = {}",Thread.currentThread().getName(),count++);
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        public static void main(String[] args) {
            final  Count count =new Count();
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    count.synMethodA();
                }
            },"t1");
            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    Count.cSynMethodA();
                }
            },"t2");
            t1.start();
            t2.start();
        }
    
    
    }
    

    测试结果

    2019-07-25 19:04:53,184   [t2] INFO  SysDemo4  - class synMethodA, Current thread is : t2, count = 0
    2019-07-25 19:04:53,199   [t1] INFO  SysDemo4  - synMethodA, Current thread is : t1, count = 0
    2019-07-25 19:04:53,683   [t2] INFO  SysDemo4  - class synMethodA, Current thread is : t2, count = 1
    2019-07-25 19:04:53,699   [t1] INFO  SysDemo4  - synMethodA, Current thread is : t1, count = 1
    2019-07-25 19:04:54,182   [t2] INFO  SysDemo4  - class synMethodA, Current thread is : t2, count = 2
    2019-07-25 19:04:54,198   [t1] INFO  SysDemo4  - synMethodA, Current thread is : t1, count = 2
    2019-07-25 19:04:54,682   [t2] INFO  SysDemo4  - class synMethodA, Current thread is : t2, count = 3
    2019-07-25 19:04:54,697   [t1] INFO  SysDemo4  - synMethodA, Current thread is : t1, count = 3
    2019-07-25 19:04:55,181   [t2] INFO  SysDemo4  - class synMethodA, Current thread is : t2, count = 4
    2019-07-25 19:04:55,197   [t1] INFO  SysDemo4  - synMethodA, Current thread is : t1, count = 4
    
    Process finished with exit code 0
    
    
  • 相关阅读:
    matplotlib基础汇总_03
    matplotlib基础汇总_02
    matplotlib基础汇总_01
    水果系统(面向过程,面向对象)
    给定几位数,查看数根(使用函数实现)
    定义函数,给定一个列表作为函数参数,将列表中的非数字字符去除
    学生管理系统-明日学院的
    四平方和
    四位玫瑰数
    学生成绩表数据包括:学号,姓名,高数,英语和计算机三门课成绩,计算每个学生总分,每课程平均分,最高分和最低分
  • 原文地址:https://www.cnblogs.com/JuncaiF/p/11246826.html
Copyright © 2020-2023  润新知