热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

滴滴二面总结

记录一下滴滴二面没有答上来的两个题目问题一:线程池如何知道线程的状态这个问题我不知道是不是应该答线程的五种状态并发编程:java线程池的五个状态_

记录一下滴滴二面没有答上来的两个题目

问题一:线程池如何知道线程的状态

这个问题我不知道是不是应该答线程的五种状态

并发编程:java线程池的五个状态_芳的程序员的博客-CSDN博客_java 线程池状态

问题二:synchronize修饰静态方法和非静态方法的区别

修饰静态方法,锁是加在类上的,类的所有对象竞争一把锁;修饰非静态方法,锁加在单个对象上,不同对象间没有竞争关系。

​​​​​​synchronized修饰静态方法和非静态方法 - 简书

首先,在java中,类只能被加载一次,引用会有多个。

然后,静态方法是不属于引用的,是属于这个类的。

synchronized如果修饰方法,jvm实现上其实是把所有的代码块用synchronized包裹住了。

synchronized(this){

    //业务逻辑

}

如果是修饰静态方法,这个this就不是引用了,就是类了。

如果是修饰普通方法的话,这个this就是这个类的引用。
https://www.baidu.com/link?url=2eRXCZP6LaSNArmclltMoim4nPuz88fGnCP8zbdt3YE3BUC03xWi2qfOL2GR20F8sGOokX58_99iSlDylpZB9a&wd=&eqid=bfec08b00000ffdd0000000362b037d5

来做一个实验吧

public class Solutionaaa {public synchronized static void sayhello(){for(int i&#61;0; i<100; i&#43;&#43;) {System.out.println("hello...");}}public synchronized void sayhi(){for(int i&#61;0; i<100; i&#43;&#43;) {System.out.println(Thread.currentThread().getName() &#43; " -> hi...");}}public static void main(String[] args) {Solutionaaa solutionaaa1 &#61; new Solutionaaa();Solutionaaa solutionaaa2 &#61; new Solutionaaa();new Thread(new Runnable() {&#64;Overridepublic void run() {solutionaaa1.sayhi();}}, "Thread1").start();new Thread(new Runnable() {&#64;Overridepublic void run() {solutionaaa2.sayhi();}}, "Thread2").start();}}

可以看到synchronized修饰非静态方法且使用不同实例执行该方法的时候是线程非安全的 

将代码修改一下&#xff0c;使用同一个实例执行该方法

public class Solutionaaa {public synchronized static void sayhello(){for(int i&#61;0; i<100; i&#43;&#43;) {System.out.println("hello...");}}public synchronized void sayhi(){for(int i&#61;0; i<100; i&#43;&#43;) {System.out.println(Thread.currentThread().getName() &#43; " -> hi...");}}public static void main(String[] args) {Solutionaaa solutionaaa1 &#61; new Solutionaaa();new Thread(new Runnable() {&#64;Overridepublic void run() {solutionaaa1.sayhi();}}, "Thread1").start();new Thread(new Runnable() {&#64;Overridepublic void run() {solutionaaa1.sayhi();}}, "Thread2").start();}}

 可以发现使用synchronized修饰非静态方法且使用同一个实例执行该方法的时候是线程安全的

我们再来看一下修饰静态方法的情况

public class Solutionaaa {public synchronized static void sayhello(){for(int i&#61;0; i<5; i&#43;&#43;) {System.out.println(Thread.currentThread().getName() &#43; " -> hello...");}}public synchronized void sayhi(){for(int i&#61;0; i<5; i&#43;&#43;) {System.out.println(Thread.currentThread().getName() &#43; " -> hi...");}}public static void main(String[] args) {new Thread(new Runnable() {&#64;Overridepublic void run() {sayhello();}}, "Thread1").start();new Thread(new Runnable() {&#64;Overridepublic void run() {sayhello();}}, "Thread2").start();}}

我执行了很多次&#xff0c;结果都是有序的&#xff0c;所以synchronized修饰静态方法的时候是线程安全的 

那么我们小结一下

使用synchronized修饰静态方法时是线程安全的

使用synchronized修饰非静态方法且使用同一实例执行方法时是线程安全的

使用synchronized修饰非静态方法且使用不同实例执行方法时是线程不安全的

最后再说一下二面的时候算法题&#xff0c;一共是做了两道题。第一道是自己实现一下栈&#xff0c;写出入栈和出站的方法&#xff1b;第二道是二分查找&#xff0c;都不是很难。


推荐阅读
author-avatar
泰山长征
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有