在JVM中具有String常量池缓存的功能

package com.cky.test;

/**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
String a= "a";
String b= "a";
System.out.println(a==b); }
}
true

将synchronized(string)同步代码块和String联合使用,结果出现意外

测试

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { public static void print(String str) {
try {
synchronized (str) {
while(true) {
System.out.println(Thread.currentThread().getName());
Thread.sleep(1000);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} } }
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{
private Service service; public ThreadA(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.print("AA");
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ private Service service; public ThreadB(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.print("AA");
}
}
package com.cky.test;

import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA(service);
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB(service);
threadB.setName("b");
threadB.start(); }
}
a
a
a
a
a
a
a
a

结果是无限循环的打印a

出现这种情况的原因是因为String的两个值都是AA,两个线程持有相同的锁。所以造成线程B不能执行,这就是String常量2池带来的问题,所以大多数情况下都不使用String做所对象,比如new Object实例化一个Object对象,但他不放入缓存中

测试

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { public static void print(Object object) {
try {
synchronized (object) {
while(true) {
System.out.println(Thread.currentThread().getName());
Thread.sleep(1000);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} } }
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{
private Service service; public ThreadA(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.print(new Object());
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ private Service service; public ThreadB(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.print(new Object());
}
}
package com.cky.test;

import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA(service);
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB(service);
threadB.setName("b");
threadB.start(); }
}
a
b
b
a
a
b
a
b
b
a

交替打印说明一个一个对象锁

2.2.10数据类型String的常量池特性的更多相关文章

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

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

  2. String对象常量池特性对synchronized对象的影响

    一 .什么是String的常量池特性 对于字符串对象有两种创建方法,如下: 直接赋值法: String str1="直接赋值创建字符串"; 创建对象法: String str2=n ...

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

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

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

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

  5. Java中的String与常量池

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

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

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

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

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

  8. String与常量池

    转自:http://blog.sina.com.cn/s/blog_69dcd5ed0101171h.html 1. 首先String不属于8种基本数据类型,String是一个对象.因为对象的默认值是 ...

  9. java中的String类常量池详解

    test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[ ...

随机推荐

  1. WebApi中Swagger的使用(超级简单)

    Swagger解释 Swagger是一种Rest API的简单但强大的表示方式,她是标准的与语言无关,这种表示方式不但人可读,而且机器可读. 可以作为Rest API的交互式文档,也可以作为Rest ...

  2. eclipse导入项目以后,内容没有错误,项目上却有个小红叉?

    对于上面的错误,应该如何解决?

  3. Oracle_SQL(5) 连接和子查询

    一.连接join一般分类: inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行. left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right ...

  4. c++ 备忘

    一.类型转换#include <sstream>stringstream ss;ss<<reverse(s1)<<'\t'<<reverse(s2);s ...

  5. Architecture.SOLID-Principles

    SOLID Principles Reference 1. Single Responsibility http://en.wikipedia.org/wiki/Single_responsibili ...

  6. iOS.C

    iOS开发中C语言的应用: 1. NS_ENUM & NS_OPTIONS http://nshipster.com/ns_enum-ns_options/

  7. 201621123008 《Java程序设计》 第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  8. php7.0-fpm.sock

    .sock  这种方式是套接字的方式连接的

  9. vim 中将 TAB 换成 4 个空格

    最近开始学习Python,其语法简单,但是对代码格式要求比较严格.代码采用缩进方式,按照约定采用4个空格的缩进. Linux下配置vim编辑器中Tab键为4个空格方法: 1. 编辑文件: vi /et ...

  10. ZVulDrill渗透环境搭建及部分题目writeup

    一  实验环境 0x01  ZvulDirll 0x02  下载地址https://github.com/redBu1l/ZVulDrill 二  配置安装 0x01  在你网站的根目录下创建一个Vu ...