一 .什么是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");

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

三.线程死锁的原因

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

String对象常量池特性对synchronized对象的影响的更多相关文章

  1. java 多线程10:synchronized锁机制 之 锁定类静态方法 和锁定类.Class 和 数据String的常量池特性

    同步静态方法 synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁.看一下例子,注意一下printC()并不是一个静态方法: public ...

  2. 2.2.10数据类型String的常量池特性

    在JVM中具有String常量池缓存的功能 package com.cky.test; /** * Created by edison on 2017/12/8. */ public class Te ...

  3. Java中的String与常量池[转帖]

    string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...

  4. Java中的String与常量池

    string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...

  5. 转载:Java中的String与常量池

    转载自http://developer.51cto.com/art/201106/266454.htm.感觉总结的不错,自己收藏一下. string是java中的字符串.String类是不可变的,对S ...

  6. (转)Java中的String与常量池

    Java中的String与常量池 转自:http://developer.51cto.com/art/201106/266454.htm string是java中的字符串.String类是不可变的,对 ...

  7. 基本数据类型的常量池与String类型常量池解析

    抛出样例: Integer a1  = new Integer(123);        Integer a2  = new Integer(123);        System.out.print ...

  8. String之常量池小结

    1.String 常量池 String使用private final char value[ ]实现字符串的存储,也就是说String创建对象之后不能够再次修改此对象中存储的字符串内容,因而Strin ...

  9. String对象常量池

    对象池的主要目的是实现数据的共享处理, 在java之中对象池可以分为两种: 1.静态常量池 :指*.class加载时会自动将此程序之中保存的 字符串.普通的常量.类和方法的信息等全部经行分配 2.运行 ...

随机推荐

  1. 用html和css制作奥运五环

    <html><head><meta charset="utf-8"> <style>.circle1,.circle2,.circl ...

  2. day26_python_1124

    1.内容回顾 2.验证客户端的合法性 3.block + 进度条 4.数据的输入和输出(铺垫并发编程)(操作系统基础) 5.进程的概念+sys.argv 1.内容回顾 # udp协议 和 tcp协议 ...

  3. Haxe:东游记(上)part1:intro

    原标题:西行漫记之Haxe初探·上篇 1. 简述:haxe是啥? haxe(读作蛤克思),是以前flash时代诞生的一种的开源跨平台方案.学会了haxe,可以直接用这种类似TypeScript的语法, ...

  4. http/1.0/1.1/2.0与https的比较

    HTTP是HyperText Transfer Protocol的缩写,译为超文本传输协议.是一种应用于OSI七层模型中应用层的协议,是我们平常互联网网络通信传输的基础.它的作用就是规定了服务器和客户 ...

  5. Vue-router的传参方式和router使用技巧

    vue传参方法一 1,路由配置 { path: '/describe/:id', name: 'Describe', component: Describe } 2,使用方法 // 直接调用$rout ...

  6. Navicat for Mysql导入mysql数据库脚本文件

    1.鼠标右键点击,然后选中运行sql文件,执行,然后选中编码方式为Utf8,即可. 2.可能会出现一系列的问题,参照着报错,进行mysql配置文件的修改.

  7. SpringBoot 2.0 pom.xml 配置(热启动)

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  8. JAVA----线程初级

    一.认识多任务.多进程.单线程.多线程 要认识多线程就要从操作系统的原理说起.   以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情.比如你在copy东西 ...

  9. Java——值传递与引用传递

    1.基本类型和引用类型在内存中的保存 (1)基本类型的变量保存原始值,即它代表的值就是数值本身:   基本类型在声明变量时就为它分配了空间:   基本类型在参数传递过程中属于值传递,也就是复制一份数据 ...

  10. CPU-bound(计算密集型) 和I/O bound(I/O密集型) 区别 与应用

    I/O密集型 (CPU-bound) I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CP ...