zoukankan      html  css  js  c++  java
  • String对象常量池特性对synchronized对象的影响

    一 .什么是String的常量池特性

     对于字符串对象有两种创建方法,如下:

    直接赋值法:

    String str1="直接赋值创建字符串";

     创建对象法:

    String str2=new String("创建对象来创建字符串");

     第一种方法是直接创建在常量池中的,下面可以看到区别:

    /**
     * @ClassName String_Synchronized
     * @Author 真正的小明被占用了
     * @Date 2018/10/21/021 14:54
     * @Version 1.0
     */
    public class String_Synchronized {
    
    
        public static void main(String[] args) {
           String str1="A";
           String str2="A";
           System.out.println(str1==str2);// true 比较两个变量的地址值,输出为TRUE证明两个对象为同一个对象
            String str3=new String("B");
            String str4=new String("B");
            System.out.println(str3==str4);//false
        }
    }

     也就是说明在常量池中创建的对象是同一个对象,而使用new关键字创建的变量是重新分配内存的,是两个不同的对象。

    二.在多线程中出现的问题

    代码如下:

    将一个类的String对象同步化

    /**
     * @ClassName String_Synchronized
     * @Author 真正的小明被占用了
     * @Date 2018/10/21/021 14:54
     * @Version 1.0
     */
    public class String_Synchronized {
    
        private String str;
    
        public String_Synchronized(String str){
            this.str=str;
        }
    
        public void fan() throws Exception {
            synchronized (str){//同步化String对像
                //假如这个方法需要大量的时间去执行多线程可以提高效率.....我们使用死循环来代替
                while(true){
                    Thread.sleep(1000);
                    System.out.println("当前的线程为"+Thread.currentThread().getName());
                }
            }
        }
    }

     线程类:

    public class Str_Thread extends Thread{
        private String_Synchronized string_synchronized;
        
        public Str_Thread(String_Synchronized string_synchronized){
            this.string_synchronized=string_synchronized;
        }
        
        @Override
        public void run(){
            try {
                string_synchronized.fan();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    测试类:

    public class Text {
    
        public static void main(String[] args) {
            String str1 ="A";
            String str2 ="A";
            String_Synchronized string_synchronized1 =new String_Synchronized(str1);
            String_Synchronized string_synchronized2 =new String_Synchronized(str2);
            Str_Thread str_thread1 =new Str_Thread(string_synchronized1);
            Str_Thread str_thread2 =new Str_Thread(string_synchronized2);
            str_thread1.start();
            str_thread2.start();
        }
    
    }

    结果就是:说明str_thread1线程没有没打断,出现死锁现象。

    我们修改一下代码:

    String str1 =new String ("A");
    String str2 =new String ("A");

     结果为:,现在即时两个线程叫错打印。

    三.线程死锁的原因

    造成线程死锁的本质原因就是:双方互相持有对方的锁,互相等待对方释放锁那么一定会造成死锁。

  • 相关阅读:
    10.C# 构造函数
    9.C# 类
    8.C#友元程序集----可访问性相关
    7.C# 多态的实现
    4.C#虚方法virtual详解
    3.C#的访问权限修饰符
    2.静态类成员、静态构造函数、静态类
    1.面向对象的基本概念
    6.C# 释放非托管资源2
    原生js实现轮播图原理
  • 原文地址:https://www.cnblogs.com/SAM-CJM/p/9826251.html
Copyright © 2011-2022 走看看