栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java synchronized锁 String 和 Integer 会有什么问题?

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java synchronized锁 String 和 Integer 会有什么问题?

一. 问题
  1. synchronized 锁String, 非final , 如果String的value值改变了会怎么样.

  2. synchronized 锁Integer, 非final, 如果Integer 值都是1 , 多个线程并发会怎么样.

  3. synchronized 锁Integer, 非final, 如果Integer 值都是128 , 多个线程并发会怎么样.

二. 答案
  1. synchronized 锁String , 如果String的value值改变了会怎么样.

String 值改变的话, 原有的锁依旧处于加锁状态. 新的线程在申请锁的时候, 会加载到新的String 值. 导致锁失效, 新的线程依旧会执行.

  1. synchronized 锁两个Integer类型的lock, 每个lock有自己的线程, 如果Integer 值都是1 , 多个线程并发会怎么样.

因为Integer类中有缓存 -128 到 127 , 如果值相同, 会导致所有的线程阻塞, 顺序执行.

  1. synchronized 锁Integer, 非final, 如果Integer 值都是128 , 多个线程并发会怎么样.

如果锁的值 超出 -128 ~127 的范围. 并发执行.

三. 代码验证 3.1. String类型

public class lockString01 {
    private static String lock = "lock";

    public static void main(String[] args) throws Exception {

        doRun("t1");
        doRun("t2");
        doRun("t3");
        doRun("t4");
        doRun("t5");

//        System.out.println("chang lock.....");
        lock = "new lock";
//        System.out.println("chang lock.....");
        doRun("t6");
        doRun("t7");
//        while (true) {
//            lock = UUID.randomUUID().toString();
//            try {
//                TimeUnit.SECONDS.sleep(1L);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
    }

    private static void doRun(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("thread: " + name + " start");
                    try {
                        System.out.println("thread: " + name + " sleep. lock is :" + lock);
                        TimeUnit.SECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread: " + name + " end");
                }
            }
        }).start();
    }

}


public class lockString02 {
    private static String lock = "lock";

    public static void main(String[] args) throws Exception {

        doRun("t1");
        doRun("t2");
        doRun("t3");
        doRun("t4");
        doRun("t5");
        doRun("t6");
        doRun("t7");
        while (true) {
            lock = UUID.randomUUID().toString();
        }
    }

    private static void doRun(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("thread: " + name + " start");
                    try {
                        System.out.println("thread: " + name + " sleep. lock is :" + lock);
                        TimeUnit.SECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread: " + name + " end");
                }
            }
        }).start();
    }

}


public class lockString03 {
    private static String lock = "lock";

    public static void main(String[] args) throws Exception {

        doRun("t1");
        doRun("t2");
        doRun("t3");
        doRun("t4");
        doRun("t5");
        doRun("t6");
        doRun("t7");
        while (true) {
            lock = UUID.randomUUID().toString();
        }
    }

    private static void doRun(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("thread: " + name + " start");
                    try {
                        System.out.println("thread: " + name + " sleep. lock is :" + lock);
                        TimeUnit.SECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread: " + name + " end");
                }
            }
        }).start();
        try {
            System.out.println("thread: " + name + " block 1 s.");
            TimeUnit.SECONDS.sleep(1L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}



3.2. Integer类型

public class lockInteger01 {
    private static Integer lock = 1;

    public static void main(String[] args) throws Exception {

        doRun("t1");
        doRun("t2");
        doRun("t3");
        doRun("t4");
        doRun("t5");


        lock = 2;
        doRun("t6");
        doRun("t7");
//        while (true) {
//            lock = UUID.randomUUID().toString();
//            try {
//                TimeUnit.SECONDS.sleep(1L);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
    }

    private static void doRun(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("thread: " + name + " start");
                    try {
                        System.out.println("thread: " + name + " sleep. lock is :" + lock);
                        TimeUnit.SECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread: " + name + " end");
                }
            }
        }).start();
    }

}



public class lockInteger02 {
    private static Integer lock = 1;

    public static void main(String[] args) throws Exception {

        doRun("t1");
        doRun("t2");
        lock = 2;
        doRun("t3");
        doRun("t4");
        doRun("t5");
        doRun("t6");
        doRun("t7");
        while (true) {
            lock = new Random().nextInt();
        }
    }

    private static void doRun(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("thread: " + name + " start");
                    try {
                        System.out.println("thread: " + name + " sleep. lock is :" + lock);
                        TimeUnit.SECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread: " + name + " end");
                }
            }
        }).start();
    }

}



public class lockInteger03 {
    private static Integer lock01 = 1;
    private static Integer lock02 = 1;
    public static void main(String[] args) throws Exception {

        doRunByLock01("1-t1");
        doRunByLock01("1-t2");
        doRunByLock01("1-t3");
        doRunByLock01("1-t4");
        doRunByLock01("1-t5");
        doRunByLock01("1-t6");
        doRunByLock01("1-t7");


        doRunByLock02("2-t1");
        doRunByLock02("2-t2");
        doRunByLock02("2-t3");
        doRunByLock02("2-t4");
        doRunByLock02("2-t5");
        doRunByLock02("2-t6");
        doRunByLock02("2-t7");
    }

    private static void doRunByLock01(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock01) {
                    System.out.println("thread lock 01 : " + name + " start");
                    try {
                        System.out.println("thread lock 01 : " + name + " sleep. lock is :" + lock01);
                        TimeUnit.SECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread lock 01 : " + name + " end");
                }
            }
        }).start();
    }

    private static void doRunByLock02(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock02) {
                    System.out.println("thread lock 02 : " + name + " start");
                    try {
                        System.out.println("thread lock 02 : " + name + " sleep. lock is :" + lock02);
                        TimeUnit.SECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread lock 02 : " + name + " end");
                }
            }
        }).start();
    }

}


public class lockInteger04 {
    private static Integer lock01 = -129;
    private static Integer lock02 = -129;
    public static void main(String[] args) throws Exception {

        doRunByLock01("1-t1");
        doRunByLock01("1-t2");
        doRunByLock01("1-t3");
        doRunByLock01("1-t4");
        doRunByLock01("1-t5");
        doRunByLock01("1-t6");
        doRunByLock01("1-t7");


        doRunByLock02("2-t1");
        doRunByLock02("2-t2");
        doRunByLock02("2-t3");
        doRunByLock02("2-t4");
        doRunByLock02("2-t5");
        doRunByLock02("2-t6");
        doRunByLock02("2-t7");
    }

    private static void doRunByLock01(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock01) {
                    System.out.println("thread lock 01 : " + name + " start");
                    try {
                        System.out.println("thread lock 01 : " + name + " sleep. lock is :" + lock01);
                        TimeUnit.SECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread lock 01 : " + name + " end");
                }
            }
        }).start();
    }

    private static void doRunByLock02(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock02) {
                    System.out.println("thread lock 02 : " + name + " start");
                    try {
                        System.out.println("thread lock 02 : " + name + " sleep. lock is :" + lock02);
                        TimeUnit.SECONDS.sleep(5L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread lock 02 : " + name + " end");
                }
            }
        }).start();
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984606.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号