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");
结果为:
,现在即时两个线程叫错打印。
三.线程死锁的原因
造成线程死锁的本质原因就是:双方互相持有对方的锁,互相等待对方释放锁那么一定会造成死锁。
String对象常量池特性对synchronized对象的影响的更多相关文章
- java 多线程10:synchronized锁机制 之 锁定类静态方法 和锁定类.Class 和 数据String的常量池特性
同步静态方法 synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁.看一下例子,注意一下printC()并不是一个静态方法: public ...
- 2.2.10数据类型String的常量池特性
在JVM中具有String常量池缓存的功能 package com.cky.test; /** * Created by edison on 2017/12/8. */ public class Te ...
- Java中的String与常量池[转帖]
string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...
- Java中的String与常量池
string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...
- 转载:Java中的String与常量池
转载自http://developer.51cto.com/art/201106/266454.htm.感觉总结的不错,自己收藏一下. string是java中的字符串.String类是不可变的,对S ...
- (转)Java中的String与常量池
Java中的String与常量池 转自:http://developer.51cto.com/art/201106/266454.htm string是java中的字符串.String类是不可变的,对 ...
- 基本数据类型的常量池与String类型常量池解析
抛出样例: Integer a1 = new Integer(123); Integer a2 = new Integer(123); System.out.print ...
- String之常量池小结
1.String 常量池 String使用private final char value[ ]实现字符串的存储,也就是说String创建对象之后不能够再次修改此对象中存储的字符串内容,因而Strin ...
- String对象常量池
对象池的主要目的是实现数据的共享处理, 在java之中对象池可以分为两种: 1.静态常量池 :指*.class加载时会自动将此程序之中保存的 字符串.普通的常量.类和方法的信息等全部经行分配 2.运行 ...
随机推荐
- ssh-keygen公钥进行免登
A服务器地址:192.168.1.200,下面简称A B服务器地址:192.168.1.201,下面简称B 1.在A生成密钥对ssh-keygen -t rsa -P ""1执行上 ...
- location.href 本窗口与window.open 新窗口打开用法
二种新窗口打开的区别: window.open("URL",'top'); 只是表示打开这个页面,并不是打开并刷新页面: window.location.href="UR ...
- REST(Representational state transfer)的四个级别以及HATEOAS介绍
Rest RES(Representational state transfer):表现层状态转移.其实它省略了主语,「表现层」其实指的是「资源」的「表现层」,所以通俗来讲就是:资源在网络中以某种表现 ...
- docker 镜像运行问题
- java实现二维码的生成.
目录 1.二维码概念 2.二维码发展历史 3.二维码分类 4.二维码优缺点 5.QR Code 1.二维码又称 二维条码 (2-dimensional bar code)是用某种特定的几何 ...
- Python-接口自动化(九)
python操作Excel处理测试数据(九) (十)python操作Excel读/写测试数据 1.夹心饼干 setUp:在每一条测试用例执行之前执行 tearDown:在每一条测试用例执行之后执行 上 ...
- pyinstaller深入使用,打包指定模块,打包静态文件
1.标准用法: pyinstall **.py 直接打包 pyinstall -F **.py 打包成单文件 pyinstall -W **.py 去掉控制台窗口,黑窗口 p ...
- vue-cli axios跨域 + 反向代理模拟http请求host+referer
axios跨域 配置config->index.js中的proxyTable,内容如下: proxyTable: { // 跨域请求 '/api': { // 注意此处可设置为 '*' 代表不限 ...
- 2017年4月13日用VS写C程序遇到的一些问题
在网上找到一篇展示计算机浮点数格式的文章,且有C代码如下: #include <stdio.h> #include <stdlib.h> #include <string ...
- webdriver的三种时间等待( sleep(); implicitly_wait(); WebDriverWait();)
https://blog.csdn.net/HeatDeath/article/details/71774572 基于<Selenium 2自动化测试实战>的学习笔记(11)—— 设置等待 ...