String常量池和synchronized关键字

[原创]Linux 802.11n CSI tool Monitor模式 Linux 802.11n CSI tool Monitor模式 使用AP模式的缺陷在于ping 命令速度比较慢,且不能精确控制发送的参数,比如接收的包数量是不可控的。Monitor模式可以调制发送速率、发包数量、发送天线个数、HT模式、short/long guard interval等等,因此调通Monitor模式是必须的。期间参考了博主沃一德的CSI Tool安装使用讲解,对他的工作表示感... 阅读详情

在java中String是一个比较特殊的类,String有一个自己的常量池,存放了初始化的字符串,这一个特性经常能导致一些坑,下面简单的介绍一点。

 

一,用常量赋值的字符串

String a=”abc”;

当执行这条语句时,先在常量池中查找是否有”abc”对象,如果有则创建对象a并指向这个对象,如果没有则先在常量池中创建”abc”对象,然后创建对象a并指向这个对象。

最终a是指向常量池的。

所以:

String a="abc";

String b="abc";

System.out.println(a==b);

输出的是true

 

二,new的字符串

String a=new String("abc");

先在常量池中查找是否有”abc”对象,如果有则把常量池中的对象复制一份,然后创建对象a并指向复制出来的这个对象,如果没有则先在常量池中创建”abc”对象,然后复制一份,然后创建对象a并指向复制出来的这个对象。

最终a不是指向常量池的。而且在第一次使用该字符串时,内存里存了两个这个字符串的对象,一个在堆里一个在常量池里。

所以:

String a=new String("abc");

String b="abc";

System.out.println(a==b);

输出的是false

再一个例子:

String a=new String("abc");

String b= new String("abc");

System.out.println(a==b);

输出的也是false

 

三,String的intern()方法

在这里要特别提到String的intern()方法,根据jdk对这个方法的描述,翻译一下大概是这样的:

当这个方法被调用时,如果常量池中有同值的字符串,则返回常量池中的字符串。如果常量池中没有这个字符串,则在常量池中创建这个字符串并返回。所谓同值,指的是equals()方法返回值为true。

所以,以下代码输出的是true

String a="abc";

String b=new String("abc").intern();

System.out.println(a==b);

 

四,System的identityHashCode()方法

另外提一下System.identityHashCode()方法,这个方法可以返回对象所属类的原有的HashCode,这个方法适合应用于hashCode()方法被重写的类。

比如本文中提到的String类的hashCode方法就被重写过,相同字符串的hashCode往往是一样的,而这个方法返回重写前的那个hashCode()方法的返回值,比如:

String a="abc";

String b="abc";

String c=new String("abc");

String d=new String("abc");

System.out.println(System.identityHashCode(a));

System.out.println(System.identityHashCode(b));

System.out.println(System.identityHashCode(c));

System.out.println(System.identityHashCode(d));

输出的内容是:

1502913001

1502913001

756151793

1982445652

可以看到,a和b确实是指向一个对象,而c和d都是堆中单独的对象。

 

五,synchronized关键字和String

java的synchronized关键字在生效时就和内存地址有关,特别是当我们使用类似

synchronized(某个变量){}

这种格式时,参数对象的内存地址只要相同,synchronized关键字的同步功能就会生效,所以我们可以写以下例子:

package test;

public class Test {

   public static void main(String[] args) {

      for (int i = 0; i < 10; i++) {    //新建10个线程一起抢锁

         String key = new String("abc");

         TestThread t = new TestThread(key);

         t.start();

      }

   }

   /**

    * 使用构造时传入的参数String作为锁,观察线程获得锁的情况

    */

   public static class TestThread extends Thread {

      public String key;

      public TestThread(String key) {

         this.key = key;

      }

      @Override

      public void run() {

         synchronized (key) {

            System.out.println(Thread.currentThread().getName() + " begin " + key);

            try {

                Thread.sleep(3000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }


            System.out.println(Thread.currentThread().getName() + " end " + key);

         }

      }

   }

}

这个例子中的同步语句是失效的,每个线程都拿到了锁并且并行执行了,因为每次定义一个线程时使用的String对象是用new的方式获得的,在内存中是不同的地址。

然后改一下key的定义方式,改成以下的例子:

package test;

public class Test {

   public static void main(String[] args) {

      for (int i = 0; i < 10; i++) {    //新建10个线程一起抢锁

         String key = "abc";

         TestThread t = new TestThread(key);

         t.start();

      }

   }

   /**

    * 使用构造时传入的参数String作为锁,观察线程获得锁的情况

    */

   public static class TestThread extends Thread {

      public String key;

      public TestThread(String key) {

         this.key = key;

      }

      @Override

      public void run() {

         synchronized (key) {

            System.out.println(Thread.currentThread().getName() + " begin " + key);

            try {

                Thread.sleep(3000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }


            System.out.println(Thread.currentThread().getName() + " end " + key);

         }

      }

   }

}

这个例子中的同步语句是生效的,每个线程争抢同一把锁,虽然key是在每次循环中定义的,但是其实使用的都是常量池中的对象,synchronized认为这都是一个对象,所以同步生效。

 

以上。

嵌入式开发中SAR与ΔΣ ADC选型指南:从原理到实战应用 模数转换器是嵌入式系统连接模拟世界与数字世界的核心接口,其选型直接决定了数据采集的精度与可靠性。SAR ADC采用逐次逼近原理,如同天平称重,通过二进制搜索快速完成转换,具备高速、多通道轮询的优势,适合电机控制、通信等动态场景。ΔΣ ADC则基于过采样与噪声整形技术,以速度换取精度,通过数字滤波输出高分辨率结果,在传感器测量、音频采集等静态高精度领域表现卓越。理解这两种架构的工作原理差异,是进行嵌入式ADC选型的基础。在实际工程中,需结合信号带宽、多通道切换需求、功耗约束及PCB布局能力进行综合权衡。例如, 阅读详情

相关推荐

【保姆级教程/代码】使用PRIDE PPP-AR软件解算ZTD、反演GNSS PWV,并评估精度

在本算例中,我下载了BJFS站2024年的IGS ZTD产品,用于评估PRIDE PPP-AR软件解算出ZTD结果的精度。

weixin_43910227的博客 2370

当synchronized 作用在String上(String#intern())

*需求: 在并发情况下,根据不同的id,查询库中数据,放在内存中,仅仅第一次查库,下次查询不再查库。。 思路:查询时,将id加锁,第一个获取锁的,就先查询,放入缓存中。后面获取锁的,先判断缓存 最开始按造下面设计: private static final ConcurrentMap&lt;String, String&gt; KEYMAP = new ConcurrentHashMap&l...

Emine 1万+

车载以太网SOMEIP入门必看:从服务发现到事件订阅,一次搞懂三种核心通信模式(附报文实例)

本文深入解析车载以太网SOME/IP的三种核心通信模式:服务发现、方法调用和事件订阅,通过真实报文实例和仿真工具演示,帮助开发者快速掌握这一关键技术。文章特别强调服务发现机制的基础作用,并详细介绍了Request/Response与Fire&Forget两种方法调用模式的应用场景,为智能汽车网络通信开发提供实用指南。

weixin_30955617的博客 111

synchronized锁字符串问题 + String.intern()解决 + google的Interners解决 java单机锁

一:String.intern()解决 比如需要锁住的商品id是Long id = 1000; synchronized (id.toString().intern()){ //do... } 造成的问题: 常量池有限,存储在hashtable中,数据多了之后,碰撞厉害,而且容易加重full gc负担 。 二: google的Interners解决 在类级别初始化** Interners.newWeakInterner()** public class test{ private static I

qq_35493807的博客 3282

超详细neo4j安装教程

一、neo4j简介 最近开始学习知识图谱,所以首先想先学习一下neo4j的使用。 Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。由于知识图谱中存在大量的关系型信息(实体—关系—实体), 使用结构化数据库进行存储将产生大量的冗余存储信息, 因此将图数据库作为知识图谱的存储容器成为流行的选择。当前较为常用的图数据库主要有 Neo4j 等。 二、neo4j的安装 功能快捷键 撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Co

qq_38335648的博客 9万+

从 SAP ABAP 到 S/4HANA,SAML 2.0 单点登录到底是怎么跑起来的

在很多 SAP 项目里,SSO 不是一个锦上添花的功能,而是系统能不能顺利上线的基本门槛。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1050

synchronized (userid.tostring().intern()){}什么作用?synchronized后边都能加什么参数?

是 Java 中的一个关键字,用于实现同步,确保多个线程在访问共享资源时能够保持一致性和线程安全。可以用于方法或代码块,以确保同一时间只有一个线程可以执行特定的代码段。这行代码使用了代码块来同步对共享资源的访问。这里的共享资源是一个字符串对象,它是通过获取的。这里的intern()方法是StringuserIdintern()StringString使用intern()方法的目的是为了确保在字符串常量池中只有一个userId。

u010055960的博客 439

GDB交叉编译与问题解决:从零到精通的深度指南

完成后,GDB会安装到/usr/local/gdb-aarch64/bin,可以用aarch64-linux-gnu-gdb --version检查。:得有支持目标架构的交叉编译工具链,比如gcc-arm-none-eabi(用于ARM裸机)或aarch64-linux-gnu-gcc(用于ARM Linux)。:在配置工具链时,运行aarch64-linux-gnu-gcc --version检查版本,确保工具链没问题。这种场景下用GDB调试,就像在荒野求生,但别慌,GDB依然是你的好伙伴。

大模型大数据攻城狮的专栏 1万+

完全理解synchronized关键字的深入用法,对象、类、字符串锁、字节码

synchronized关键字的作用 Java中的关键字synchronized的作用应该都明白,在并发编程中经常使用,是JVM级的锁实现,这里就不做过多说明。它的用法是提供一个key来使代码块互斥的被多个线程执行。笔者这里的说法可能和常规说法有点不同。因为我用了一个key的概念。笔者认为,它的底层实现就是一个key。哪个线程竞争到了key,就能开锁进入被锁住的代码块中执行,否则将无限等待下去。 ...

mt23 625

蓝牙攻防实战:蓝牙技术详解

蓝牙作为轻量级、低功耗的无线通信技术,其设计兼顾了效率与灵活性,但也留下了诸多安全隐患。随着物联网设备的爆发式增长,蓝牙的攻击面也在不断扩大。理解其底层通信机制、协议栈结构以及配对加密逻辑,是提升无线安全防护能力的关键。

idlecloud0105的博客 739

基于Simulink的自适应反步法(Adaptive Backstepping)控制​

本文针对非线性系统控制中未知参数和强非线性耦合的挑战,提出基于Simulink的自适应反步法解决方案。通过融合参数在线估计与反步递归设计,该方法显著提升了永磁同步电机(PMSM)速度控制的鲁棒性,使跟踪误差从20%降至3%,参数估计收敛时间小于0.5秒。文章详细阐述了从算法推导到Simulink实现的完整流程,包括系统架构设计、核心算法推导(以PMSM为例)、模块化建模方法、参数优化策略以及工程部署建议。提供的自适应控制器MATLAB代码和关键参数表可直接应用于实际工程,为电机驱动、机械臂等非线性系统控制提

xiaoheshang_123的博客 101

使用String.intern() 减小synchronized锁字粒度

String的intern()方法,其实总结一句就是调用这个方法之后把字符串对象加入常量池中,常量池我们都知道他是存在于方法区的,他是方法区的一部分,而方法区是线程共享的,所以常量池也就是线程共享的,但是他并不是线程不安全的,他其实是线程安全的,他仅仅是让有相同值的引用指向同一个位置而已,如果引用值变化了,但是常量池中没有新的值,那么就会新开辟一个常量结果来交给新的引用,而并非像线程不同步那样,针...

春风化雨 2454

HTML5+CSS3+JS小实例:扇形展开折叠菜单

你肯定见过那种圆形浮动按钮(FAB),点一下弹出几个选项。大部分实现就是菜单项从底下往上"弹"出来,排成一列——能用,但没啥记忆点。后来我看到 Path 那个经典的扇形菜单,点一下,五个按钮像花瓣一样从中心散开,每个带不同的延迟和弹性曲线。当时就觉得:这才对嘛,交互就该有点"戏剧性"。今天拆一个纯手写版本,HTML + CSS + JS,不依赖任何库。六菜单项、扇形 144° 展开、弹性过渡、点击关闭、键盘可达——该有的都有。

艾恩小灰灰的博客 164

Java多线程String的常量池特性

在JVM中具有String常量池缓存的功能将synchronized(string)同步块与String联合使用时,要注意常量池带来的一些例外。 出现这样的情况是因为String的两个值都是AA,两个线程持有相同的锁,所以造成线程B不能执行。这就是String常量池所带来的问题。 这样实例化一个对象就持有两个不同的锁了。

IsResultXaL的博客 1687

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

synchronized关键字

1.synchronized同步代码块 synchronized关键字就不过多记录了,同一个对象进入方法会同步,不同的对象不会同步。下面来介绍一下同步代码块 synchronized(this){ //对象锁 } 同步代码块的优点我觉得是所有线程可以进入非代码块的部分,到有同步代码块的地方等待,而用关键字的话,调用此方法就要开始等待,很耗时。 2. synchronized(object)代码块...

rainwangdayu的博客 135

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

synchronized数据类型String的常量池特性(菜鸟玩线程)

synchronized数据类型String的常量池特性 在JVM虚拟机中有String常量池缓存的功能,将synchronized(String)同步块与String联合起来使用时,注意常量池带来的一些例外。 示例 自定义共享变量类 package com.chapter02.thread2_2_10; public class Service { public static void ...

Zohar的博客 598

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

synchronized加锁String踩坑日记

synchronized加锁String踩坑日记 本文参考 juejin.im/post/59fffd… JVM内存分布 我们知道String.intern()方法会判断该字符串是否存在常量池中,如果存在直接获取,不存在将当前字符串放到常量池中 String 分情况存在于常量池跟JVM堆中,首先让我们来看一下例子一: public class TestStringSycn { pu...

weixin_34396103的博客 893

Java 多线程 (PART XII)synchronized(V) 非this 对象X和String常量池

String常量池:String常量池,是java为了保存字符串常量在方法区里开辟的一段空间,在执行如String str=”aa”;是会先检查常量池中有没有“aa”,如果有则直接让str指向常量池中的“aa”,如果没有则会新建一个“aa”,并且将str指向“aa”。String和synchronized:如果使用String作为对象锁,如果字符串相同则加锁的对象是同一个。示例代码class Ser

Don't rush and never settle. If it's meant to be, it will be. 379

说说自己是怎么使用 synchronized 关键字,在项目中用到了吗synchronized关键字最主要的三种使用方式

修饰实例方法: 作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁 修饰静态方法: 也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对 象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份)。所以如果 一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静 态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占

Java 1479

(二)synchronized关键字(2)

1111

nimab1987的专栏 170

synchronized关键字使用总结

“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是取到的数据其实是被更改过的。而“线程安全”就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象。本篇博客主要介绍synchronized关键字的使用总结

拾年一剑 的专栏 1002

synchronized线程同步关键字与intern字符串常量池方法

在 Java 中,是一个关键字,用于实现线程同步,确保多个线程在访问共享资源时的安全性。它可以防止多个线程同时执行特定代码块,从而避免数据不一致的问题。

2502_92141759的博客 637

No.1.测试Synchronized一个String字符串后的多线程同步状况

测试目的描述 Synchronized关键字锁定String字符串可能会带来严重的后果, 尽量不要使用 synchronized(String a) 因为JVM中,因为字符串常量池具有缓冲功能! 接下来, 测试使用""的形式引用字符串和使用new的String()来声明一个字符串, 再使用Synchronized关键字同步该字符串,看两个线程共同调用含有这个Synchronized锁定的字符串的...

weixin_30361641的博客 271

synchronized(this)和synchronized(obj)

首先synchronized(this)和synchronized(obj)区别

weixin_43887870的博客 2491

多线程之synchronized同步语句块(5)

数据类型String的常量池特性 在JVM中具有String常量池缓存的功能。 将synchronized(string)同步块与String联合使用时,要注意常量池以带来的一些例外。 package test; /** * @Author LiBinquan */ public class Service { public static void print(String str...

qq_27581753的博客 155

synchronized关键字(三)

一、三个结论 对于 synchronized(非 this 对象 x) 当多个线程同时执行 synchronized(x){} 同步代码块时呈现同步效果 当其他线程执行 x 对象中 synchronized 同步方法时呈同步效果 当其他线程执行 x 对象方法里面的 synchronized(this) 代码块时也呈同步效果 需要说的是,虽然有三点,都是本质都是一样的,即每个线程拥有相同的对象锁...

NULL的博客 536
上一篇: 几种REST客户端简介(附下载路径)
下一篇: Java的对象头和对象组成详解
lkforce
博客等级 码龄17年 399粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值