java synchronized 同步

1.修饰 非静态方法 锁对象 public synchronized void func(){}

2.修饰 静态方法 锁类 public synchronized static void func(){}

3.修饰 代码块 可以锁变量, 对象,类

锁变量 public void func(Integer num){ synchronized(num){}}

锁对象 public void func(){synchronized(this){}}

锁类  public void func(){synchronzed(Data.class){}}

package com.lt.test;

import java.util.concurrent.TimeUnit;

public class testUnit {

    public static void main(String[] args) {

        // 关键是看锁的是什么,如果是同一个资源,那么就需要等待,不是同一个资源就不需要等待
        //测试 对象锁  修饰的是非静态方法
        Data data = new Data();
        new Thread(()->{data.fun1();},"name1").start();
        new Thread(()->{data.fun2();},"name2").start();

        //测试 类锁 修饰的是静态方法
        new Thread(()->{ Data2.fun1();},"name1").start();
        new Thread(()->{ Data2.fun2();},"name2").start();

        //测试 代码块锁 可以锁对象,可以锁类,可以锁变量 修饰的代码块
        //锁对象 只创建一个对象,同步生效
        Data3 data3 = new Data3();
        for (int i = 0; i <3; i++) {
            new Thread(()->{
                data3.fun1();
            },"name"+i).start();
        }

        //锁对象 创建多个对象,锁失效
        for (int i = 0; i <3; i++) {
            Data3 data31 = new Data3();
            new Thread(()->{
                data31.fun1();
            },"name"+i).start();
        }

        //锁类  创建一个或者多个对象,锁都生效
        Data3 cdata3 = new Data3();
        for (int i = 0; i <3; i++) {
            Data3 data31 = new Data3();
            new Thread(()->{
                cdata3.fun2();
            },"name"+i).start();
        }
        for (int i = 0; i <3; i++) {
            Data3 data31 = new Data3();
            new Thread(()->{
                data31.fun2();
            },"name"+i).start();
        }
        //锁方法的变量num 变量在内存中只有一个时,锁是生效,方法Integer 变量的常量池范围是 -128-127,在这个范围外,方法调用的时候num 都会被重新创建,这时锁失效。
        for (int i = 0; i < 3; i++) {
            Data3 data33 = new Data3();
            new Thread(()->{
                data33.fun3();
            },"name"+i).start();
        }
        Data3 fdata33 = new Data3();
        for (int i = 0; i < 3; i++) {

            new Thread(()->{
                fdata33.fun3();
            },"name"+i).start();
        }

        //锁类非静态变量  变量在内存中只有一个时,锁是生效,方法Integer 变量的常量池范围是 -128-127,在这个范围外,方法调用的时候num 都会被重新创建,这时锁失效。
        for (int i = 0; i < 3; i++) {
            Data3 data33 = new Data3();
            new Thread(()->{
                data33.fun4();
            },"name"+i).start();
        }
        Data3 cdata33 = new Data3();
        for (int i = 0; i < 3; i++) {

            new Thread(()->{
                cdata33.fun4();
            },"name"+i).start();
        }

        //锁类静态变量  变量在内存中只有一个时,锁是生效,方法Integer 变量的常量池范围是 -128-127,在这个范围外,方法调用的时候num 都会被重新创建,这时锁失效。
        for (int i = 0; i < 3; i++) {
            Data3 data33 = new Data3();
            new Thread(()->{
                data33.fun5();
            },"name"+i).start();
        }
        Data3 data33 = new Data3();
        for (int i = 0; i < 3; i++) {

            new Thread(()->{
                data33.fun5();
            },"name"+i).start();
        }

        //被锁的变量必须初始化。也就是在内存中必须有。方法变量,非静态变量,静态变量的锁原理是一样


    }

    // 修饰非静态方法--锁的是同一个对象 资源
    static class Data{
        public synchronized void fun1(){
            try {
                TimeUnit.SECONDS.sleep(1);
            }catch (Exception e){
                e.printStackTrace();
            }
            System.out.println("object1");
        }

        public synchronized  void fun2(){
            System.out.println("object2");
        }
    }

    // 修饰的是静态方法,锁的是类资源
    static  class Data2{
        public synchronized static void fun1() {
            try{
                TimeUnit.SECONDS.sleep(1);
            }catch (Exception e){
                e.printStackTrace();
            }
            System.out.println("class1");
        }

        public synchronized static void fun2(){
            System.out.println("class2");
        }
    }

    static class Data3{
        // 锁对象
        public void fun1(){
            synchronized (this){
                System.out.println("object-start");
                try{
                    TimeUnit.SECONDS.sleep(1);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("object-end");
            }
        }
        //锁类
        public void fun2(){
            synchronized (Data3.class){
                System.out.println("class-start");
                try{
                    TimeUnit.SECONDS.sleep(1);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("class-end");
            }
        }


        //锁方法变量
        public void fun3(){
            Integer num = 1;
            synchronized (num){
                System.out.println("num-start");
                try{
                    TimeUnit.SECONDS.sleep(1);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("num-end");
            }
        }

        private Integer numObject=1;
        //锁非静态变量
        public void fun4(){
            synchronized (numObject){
                System.out.println("numObject-start");
                try{
                    TimeUnit.SECONDS.sleep(1);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("numObject-end");
            }
        }

        private static Integer numClass=127;
        //锁静态变量
        public void fun5(){
            synchronized (numClass){
                System.out.println("numClass-start");
                try{
                    TimeUnit.SECONDS.sleep(1);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("numClass-end");
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Listest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值