Loading...
首先,Integera1=100,把一个int数字赋值给一个封装类型,Java会默认进行装箱操作,也就是调用Integer.valueOf()所以,对于这个面试题来说,两个Integer对象,因为值都是100,并且默认通过装箱机制调用了valueOf方法。其次,在Integer内部设计中,用到了享元模式的设计,享元模式的核心思想是通过复用对象,减少对象的创建数量,按照大家对于Java基础的认知,两个独立的对象用==进行比较,是比较两个对象的内存地址。但是在这个场景中,得到的结果是true。
能谈一下CAS机制吗?
所以呢,CompareAndSwap的底层实现中,在多核CPU环境下,会增加一个Lock指令对缓存或者总线加锁,从而保证比较并替换这两个指令的原子性。CompareAndSwap是一个native方法,实际上它最终还是会面临同样的问题,就是先从内存地址中读取state的值,然后去比较,最后再修改。这个逻辑看起来没有任何问题,但是在多线程环境下,会存在原子性的问题,因为这里是一个典型的,Read-Write的操作。否则,返回false,表示修改失败,而这个过程是原子的,不会存在线程安全问题。
死锁的发生原因和怎么避免
所谓按序申请,是指资源是有线性顺序的,申请的时候可以先申请资源序号小的,再申请资源序号大的,这样线性化后自然就不存在循环了。对于“不可抢占”这个条件,占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源,这样不可抢占这个条件就破坏掉了。循环等待条件,线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源,就是循环等待。(如图),死锁,简单来说就是两个或者两个以上的线程在执行的过程中,争夺同一个共享资源造成的相互等待的现象。
程序员:“高薪是骗局!!”,事多钱少才是真。
坐在图书馆里,看着身边一起奋斗的同学,我顿时感觉充满了力量,最后我顺利拿到了中电在线的offer,一步一步的做到了技术总监。现在出来创业,我知道很多的程序员对于自己的未来很迷茫,不知道如何突破“35岁”的大关,也不知道程序员这行还能不能赚到钱。我是一个爱谈钱的人,非得是高回报的事情我才建议大家去冲一冲,那么程序员的高回报事情是什么呢?跟大部分人一样,大一玩了整整一年,躺在宿舍床上,舍友全部都已经睡去,只有我,翻来覆去的睡不着,迷茫着自己的未来。第二天醒来,又继续想,做程序员能不能赚到钱呢。
new String(“hello“)之后,到底创建了几个对象?
lo存在于字符串常量池中,newString("lo")存在于堆中,Strings4="hel"+newString("lo")实质上是两个对象的相加,编译器不会进行优化,相加的结果存在于堆中,而s1存在于字符串常量池中,当然不相等。否则,复制一份该字面量到字符串常量池并返回它的引用。接下来,JVM会拿字面量“hello”去字符串常量池里面试图去获取它对应的String对象引用,如果拿不到,就会在堆内存里面创建一个”hello”的String对象,并且把引用保存到字符串常量池里面。
Dubbo的出现背景
Dubbo是阿里巴巴内部使用的一个分布式服务治理框架,2012年开源,因为Dubbo在公司内部经过了很多的验证相对来说比较成熟,所以在很短的的还是件就被很多互联网公司使用,再加上阿里出来的很多技术大牛进入各个创业公司担任技术架构以后,都以Dubbo作为主推的RPC框架使得dubbo很快成为了很多互联网公司的首要选择。服务治理主要是针对大规模服务化以后,服务之间的路由、负载均衡、容错机制、服务降级这些问题的解决方案,而Dubbo实现的不仅仅是远程服务通信,并且还解决了服务路由、负载、降级、容错等功能。
dubbo的应用场景与高级特性之高级用法篇
🍅作者简介:Tom,咕泡科技的联合创始人,兼任CTO(首席技术官)。著有畅销书《设计模式就该这样学》、《Netty4核心原理与手写RPC框架实战》、《Spring5核心原理与30个类手写实战》,也是电子工业出版社“Java架构师成长丛书”长期签约作者。
30岁Java老炮?非大厂不进!
可长达半年的空窗期,也是真实存在的,对于30岁左右的技术人来说,这样的黄金时间,是耽误不起一点的,及时找准自己的位置,完成职场升级,对未来的职业发展也尤为重要,所以,如果大家想进入大厂,但又一直没有找到机会,不妨试试咕泡大厂私教班,老师皆为大厂的在职专家,而且至少是P7级以上的管理者,十多年左右的工作经验。又是怎么一步一步突破面试?面试的过程中,我们的私教老师,也动用了自己的个人资源,联系到正在某团工作的朋友,咨询了目前正在美团工作的工程师的建议,以及关于面试问题的相关梳理,针对性的对技术面进行了强化。
爆肝一个月,24年春招java面试题总计50w字(附答案)
站在面向对象的思想来说,Runnable相当于一个任务,而Thread才是真正处理的线程,所以我们只需要用Runnable去定义一个具体的任务,然后交给Thread去处理就可以了,这样达到了松耦合的设计目的
Java开发、28岁、2个月、从离职到拿下60W+Offer
我们能理解人有惰性,为了让你们能学的会,我们会安排专门的班主任老师实时跟进你的学习情况,同时,咕泡云课堂也会记录你的学习时长,如果你在规定的时间内没有学习,那么班主任一定会及时督促。这是事实,但也不一定全对,如果你的技术达标,职场素养优秀,那么任何时候,优秀的岗位都会向你开放,但如果简历平平,技术能力不够扎实,项目学历也不拔尖,那么任何时候找工作,可能都是“困难模式”。在2023年的尾巴上,回顾一整年,在我们服务的学员中,能更快拿到结果的人,身上总有闪光的特质。大家都在说,现在内卷严重;
HashMap什么时候扩容,如何扩容?
在任何编程语言中,我们经常需要在内存中去临时存放一段数据,我们可以使用官方封装好的一些集合框架。比如说用List、HashMap、Set等等作为临时数据存储的容器。当我们创建一个集合对象的时候,实际上就是在内存里面一次性申请了一块内存空间。而这个内存空间的大小是在创建集合对象的时候去指定的。比如HashMap的默认大小是16。在实际开发过程中,我们需要去存储的数据量往往是大于存储容器的默认大小的。所以,出现容量默认大小不能满足需求时,就需要扩容。
谈谈ArrayList、LinkedList、和Vector的存储性能及特性
关于ArrayList、Vector和LinkedList的存性能理及特性,我从以下3个方面来分析:1)首先,ArrayList和Vector的底层都是采用数组的来存储数据,而且都是根据索引来取数据,这样设计使得获取数据快而插入数据慢。另外,每次扩容都要移动数组中的元素,存储数据量较大的时候会影响读写性能。2)其次,由于Vector中的方法都使用了synchronized修饰,因此,Vector中对数据操作都是线程安全的,但性能上比ArrayList差。
Spring中用到了哪些设计模式?
1、工厂模式。Spring的BeanFactory类,就是使用了简单工厂模式。它主要提供getBean()方法,用来创建对象的实例;我们见得比较多的ApplicationContext也是继承自BeanFactory。2、单例模式。Spring中的Bean默认为singleton单例。我们可以通过配置Bean的作用域scope参数来进行修改。SpringBean一共有5种内置的作用域,分别是singleton、prototype、request、session、globalSession。
看完这篇文章告诉你RocketMQ为什么要放弃Zookeeper?
对于分布式消息中间件而言,当不同的消息存储在不同的Broker上,生产者和消费者对于Broker的选取,路由选择会面临以下几个问题:1、生产者发一条消息,应该发到哪个Broker?消费者接收消息,从哪个Broker获取消息?2、如果Broker增加或者减少了,客户端怎么知道?3、一个新的生产者或者消费者加入,如何感知?所以,只要是跟分布式服务调用的场景,都需要一个注册中心,在RocketMQ当然也中需要有一个这样的角色来管理Broker的信息。
Spring中有几种依赖注入的方式
文末整理了一些我整理的从小白到架构师的学习资料,价值很高!Spring中,依赖注入的方式主要有以下三种:1、通过构造器注入,这也是Spring官方推荐的方式,如代码所示:这种方式,在注入对象很多的情况下,构造器参数列表会很长,所以,不够灵活。当然,好处就是,对象初始化完成后,就可可获得可使用的对象。另外,还可以检测循环依赖。2、通过Setter方法注入,这种方式在日常开发中不太常见,如代码所示:这种方式是利用set方法来注入,可以确保注入前不依赖Spring容器。
导致Spring事务失效的原因有哪些?
文末整理了一些我整理的从小白到架构师的学习资料,价值很高!下面给大家总结一下,导致Spring事务失效的原因主要有以下8个:1、方法没有被public修饰在开发过程中,如果@Transactional事务注解添加在不是public修饰的方法上,这个时候,Spring的事务就会失效。2、类没有被Spring托管如果事务方法所在的类没有加载到SpringIoC容器中,也就是说,事务方法所在的类没有被Spring管理,从而导致Spring无法实现代理,所以,Spring事务也会失效。
SimpleDateFormat是线程安全的吗?
先说答案,SimpleDateFormat不是线程安全的。因为,SimpleDateFormat类的内部有一个Calendar对象引用,这个对象主要用来储存和这个SimpleDateFormat相关的日期信息。当我们把SimpleDateFormat作为多个线程的共享资源来使用的时候,那就意味着多个线程之间会共享这个SimpleDateFormat里面的Calendar引用。如果多个线程同时于操作这个Calendar对象的情况下,就会出现数据脏读的现象,从而导致一些不可预料的错误。
谈谈String、StringBuffer和StringBuilder的区别
String内部的value值是final修饰的,所以它是不可变类。因此,每次修改String的值,都会产生一个新的对象。而StringBuffer和StringBuilder是可变类,它们在字符串变更的时候,不会产生新的对象。String是不可变类,所以它是线程安全的。StringBuffer是线程安全的,因为它每个操作方法都加了synchronized同步关键字。而StringBuilder不是线程安全的。
Redis和MySQL如何保证数据一致性
在这样一个架构中,会出现一个问题,就是一份数据,同时保存在数据库和Redis中,当数据发生变化的时候,需要同时更新Redis和MySQL,由于更新是有先后顺序的,这这种两边写入的环境下,并不能像单纯数据库的操作一样,可以满足ACID特性。那如果是先删除缓存,再更新数据库,理想情况是应用下次访问Redis的时候,发现Redis里面的数据是空的,就从数据库加载保存到Redis里面,那么数据是一致的。再比如,还可以直接通过Canal组件,来监控MySQL中Binlog的日志,把更新后的数据同步到Redis中。
Spring Bean的理解
这段代码是标准的Spring配置内容,咱们从上往下来看,首先导入一个叫做resource1.xml的标准配置文件,然后,导入了第二个标准的配置文件resource2.xml,接着,定义了一个叫做userService的Bean,对应的类是com.gupaoedu.vip.UserService,并且声明了在userService实例化之后要调用init()方法,在userService销毁之后调用destory()方法。2、需要定义命名空间的配置,如:context、aop、mvc等。