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

  1. package com.cky.test;
  2.  
  3. /**
  4. * Created by edison on 2017/12/8.
  5. */
  6. public class Test {
  7. public static void main(String[] args) {
  8. String a= "a";
  9. String b= "a";
  10. System.out.println(a==b);
  11.  
  12. }
  13. }
  1. true

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

测试

  1. package com.cky.bean;
  2.  
  3. /**
  4. * Created by edison on 2017/12/8.
  5. */
  6. public class Service {
  7.  
  8. public static void print(String str) {
  9. try {
  10. synchronized (str) {
  11. while(true) {
  12. System.out.println(Thread.currentThread().getName());
  13. Thread.sleep(1000);
  14. }
  15. }
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19.  
  20. }
  21.  
  22. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.bean.Service;
  4.  
  5. /**
  6. * Created by edison on 2017/12/8.
  7. */
  8. public class ThreadA extends Thread{
  9. private Service service;
  10.  
  11. public ThreadA(Service service) {
  12. this.service = service;
  13. }
  14.  
  15. @Override
  16. public void run() {
  17. super.run();
  18. service.print("AA");
  19. }
  20. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.bean.Service;
  4.  
  5. /**
  6. * Created by edison on 2017/12/8.
  7. */
  8. public class ThreadB extends Thread{
  9.  
  10. private Service service;
  11.  
  12. public ThreadB(Service service) {
  13. this.service = service;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. super.run();
  19. service.print("AA");
  20. }
  21. }
  1. package com.cky.test;
  2.  
  3. import com.cky.bean.Service;
  4. import com.cky.thread.ThreadA;
  5. import com.cky.thread.ThreadB;
  6.  
  7. /**
  8. * Created by edison on 2017/12/8.
  9. */
  10. public class Test {
  11. public static void main(String[] args) {
  12. Service service = new Service();
  13. ThreadA threadA = new ThreadA(service);
  14. threadA.setName("a");
  15. threadA.start();
  16. ThreadB threadB = new ThreadB(service);
  17. threadB.setName("b");
  18. threadB.start();
  19.  
  20. }
  21. }
  1. a
  2. a
  3. a
  4. a
  5. a
  6. a
  7. a
  8. a

结果是无限循环的打印a

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

测试

  1. package com.cky.bean;
  2.  
  3. /**
  4. * Created by edison on 2017/12/8.
  5. */
  6. public class Service {
  7.  
  8. public static void print(Object object) {
  9. try {
  10. synchronized (object) {
  11. while(true) {
  12. System.out.println(Thread.currentThread().getName());
  13. Thread.sleep(1000);
  14. }
  15. }
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19.  
  20. }
  21.  
  22. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.bean.Service;
  4.  
  5. /**
  6. * Created by edison on 2017/12/8.
  7. */
  8. public class ThreadA extends Thread{
  9. private Service service;
  10.  
  11. public ThreadA(Service service) {
  12. this.service = service;
  13. }
  14.  
  15. @Override
  16. public void run() {
  17. super.run();
  18. service.print(new Object());
  19. }
  20. }
  1. package com.cky.thread;
  2.  
  3. import com.cky.bean.Service;
  4.  
  5. /**
  6. * Created by edison on 2017/12/8.
  7. */
  8. public class ThreadB extends Thread{
  9.  
  10. private Service service;
  11.  
  12. public ThreadB(Service service) {
  13. this.service = service;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. super.run();
  19. service.print(new Object());
  20. }
  21. }
  1. package com.cky.test;
  2.  
  3. import com.cky.bean.Service;
  4. import com.cky.thread.ThreadA;
  5. import com.cky.thread.ThreadB;
  6.  
  7. /**
  8. * Created by edison on 2017/12/8.
  9. */
  10. public class Test {
  11. public static void main(String[] args) {
  12. Service service = new Service();
  13. ThreadA threadA = new ThreadA(service);
  14. threadA.setName("a");
  15. threadA.start();
  16. ThreadB threadB = new ThreadB(service);
  17. threadB.setName("b");
  18. threadB.start();
  19.  
  20. }
  21. }
  1. a
  2. b
  3. b
  4. a
  5. a
  6. b
  7. a
  8. b
  9. b
  10. 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. css兼容性写法大全

    淘宝初始化代码 body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset ...

  2. centos7下的FastDFS5.09的安装与使用

    FastDFS是一款开源的轻量级分布式文件系统,纯C实现,支持Linux.FreeBSD等Unix系统. 类google FS,不是通用的文件系统,只能通过专有API访问. FastDFS服务端有两种 ...

  3. MVC报错:找到多个与名为“Home”的控制器匹配的类型。

    错误原因是:在根目录中的Controller中有HomeController,而在Areas中也有一个HomeController,只是他们的命名空间不一样. 这样的话,只需要在对应的路由注册中加入命 ...

  4. 分析params_s方法

    /** * 解析启动模式参数 * @param $opt */ static public function params_s($opt) { //判断传入了s参数但是值,则提示错误 if ((iss ...

  5. Python.tornado.2.tornado.options

    记录Tornado-4.0.2源码的阅读,学习,分析 options.py 1. imports 部分 1.1 __future__ from __future__ import absolute_i ...

  6. JavaScript.how-to-debug-javascript

    How to debug JavaScript code 1. 写一个HTML文件.例如: <!DOCTYPE html> <html> <title>Web Pa ...

  7. geoserver 发布无坐标png

    1.geoserver 安装一些插件的时候,直接去http://docs.geoserver.org/ 官网,选择自己geoserver对应的版本的插件就可以了. 2.geoserver 发布自身带有 ...

  8. 可迭代对象(Iterable)和迭代器(Iterator)

     迭代是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一 个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1. 可迭代对象 以直接作用于 ...

  9. ubuntu下安装配置ADB

    1.下载SDK Tools for Linux,地址:http://developer.android.com/sdk/index.html 2.解压,将 android-sdk-linux 文件夹放 ...

  10. 【转载】为什么任何随便输入的账号使用SYSDBA权限都能登陆oracle

    其实简单点就是检查一下你的机器有没有一个ora_dba用户组,而且你登陆os的用户是否在这个组里,有的话问题的原因就找到了,下面是转的高手的介绍 本文环境配置:Oracle10gR2,Windows ...