首页 文章 精选 留言 我的

精选列表

搜索[权限提升],共10000篇文章
优秀的个人博客,低调大师

从面试到技术提升(Java篇-上卷)

背景 其实,这系列文章我构思了很久。从我大概2016年初断断续续在CSDN上写博客开始,我就想好好整理一篇Android的综合文章。奈何那个时候功力尚浅,没办法驾驭(虽然现在依然彩笔一支)。 时至今日,算是正式开始动笔,其实之前想过很多文章计划,比如2018年开年的周期计划。不过写了8篇便放弃了。今天借着正正经经写公众号(IT面试填坑小分队)的机会,把这个《地表有点强》系列坚持下去,加油! OK,闲话不说。先从Java开始~ 《Java篇-上卷》 1、new一个类会发生什么? Model model= new Model () JVM会通过双亲委派机制将Model .class加载到内存中。 执行类里的静态代码块(如果有的话)。 在堆内存中申请内存空间,并分配内存地址给我们真正的Model对象。 在堆/栈内存里建立对象的属性(基本类型在栈中,引用类型和数组在堆中),并进行初始化赋值。 开始对象的构造代码块初始化(如果有的话)。 调用对象对应的构造方法进行初始化。 将对象的被分配的内存地址赋值给model变量。 概念性的描述: 加载:首相将类的全部信息加载到JVM的方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法去中这个类的信息入口(可以理解成是这个java代码的数据结构)。 连接:分为三个部分: 验证:验证类是否合法(判断这个代码文件是否符合JVM的标准)。 准备:为静态变量分配内存并设置赋初始值,非静态变量在此时不会被分配内存(还没出生,也就是为什么静态不能调用非静态)。 解析:将常量池里的符号引用转换为直接引用。 初始化:初始化类的静态赋值语句和静态代码块,主动引用(就是那几种可以造成类初始化的行为)会被触发类的初始化,被动引用不会触发类的初始化。 使用:执行类的初始化,主动引用会被触发类的初始化,被动引用不会触发类的初始化。 卸载:卸载过程就是清楚堆里类的信息,以下情况会被卸载:① 类的所有实例都已经被回收。② 类的ClassLoader被回收。③ 类的CLass对象没有被任何地方引用,无法在任何地方通过 反射访问该类。(GC) 2、双亲委派机制? 谈到双亲委派,必须要提到类加载器 类加载器可以分为三类: 启动类加载器(Bootstrap ClassLoader):负责加载<JAVA_HOME>\lib目录下或者被-Xbootclasspath参数所指定的路径的,并且是被虚拟机所识别的库到内存中。 扩展类加载器(Extension ClassLoader):负责加载<JAVA_HOME>\lib\ext目录下或者被java.ext.dirs系统变量所指定的路径的所有类库到内存中。 应用类加载器(Application ClassLoader):负责加载用户类路径上的指定类库,如果应用程序中没有实现自己的类加载器,一般就是这个类加载器去加载应用程序中的类库。 聊一下双亲委派模型,流程图如下所示 双亲委派 简单流程:如果一个类加载器收到了加载类的请求,它不会自己立即去加载类,它会先去请求父类加载器,每个层次的类加载器都是如此。层层传递,直到传递到最高层的类加载器,只有当 父类加载器反馈自己无法加载这个类,才会有当前子类加载器去加载该类。 落实到代码上就是: public abstract class ClassLoader { protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { //首先,检查该类是否已经被加载 Class c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { //先调用父类加载器去加载 if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { } if (c == null) { //如果父类加载器没有加载到该类,则自己去执行加载 long t1 = System.nanoTime(); c = findClass(name); } } return c; } } 3、如何判断对象死了? 引用计数法:有对这个对象的引用就+1,不再引用就-1,但是这种方式看起来简单美好,但它却无法解决循环引用的问题。 可达性分析算法:可达性分析算法通过一系列称为GC Roots的对象作为起始点,从这些节点从上向下搜索,搜索走过的路径称为引用链,当一个对象没有任何引用链 与GC Roots连接时就说明此对象不可用,也就是对象不可达。(也就是说可以被回收) 什么样的对象才能被称之为GC Roots对象? 虚拟机栈中引用的对象(栈帧中的本地变量表) 方法去中类的静态属性引用的对象 方法区中常量引用的对象 Native方法引用的对象 4、synchronized理解? synchronized同步的俩种写法: synchronized(this):对象锁 public synchronized void method(){} public void method(){ synchronized(this) {} } synchronized(ClassName.class):类锁 public void method() { synchronized(ClassName.class) {} } public static synchronized method(){} 它们的区别大概可以这么理解:对象锁:Java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁(也就是传入的对象),当然如果已经有线程获取了这个对象的锁,那么当前线程会等待;synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。 类锁:首先来说,Java类可能会有很多个对象,但是只有一个Class对象,也就是说类的不同实例之间共享这一个的Class对象。Class对象就是一个特殊的Java对象。 类锁和对象锁不是同一个东西,一个是类的Class对象的锁,一个是类的实例的锁。也就是说:一个线程访问静态synchronized的时候,允许另一个线程访 问对象的实例synchronized方法。反过来也是成立的,因为他们需要的锁是不同的。 5、如何理解volatile? 首先我们先了解一下JMM,Java内存模型。 Java内存模型规定了所有变量(这些变量包括实例变量、静态变量等,但不包括局部变量、方法参数等,因为这些变量存放在栈中,是线程私有的,并不存在竞争)都存在主内存中,每个线程会有自己的工作内存,工作内存里保存了线程所使用到的变量在主内存里的副本拷贝,线程对变量的操作只能在自己的工作内存里进行,不能直接读写主内存,彼此线程之间也不可见。 Java线程模型 volatile有两条关键的语义: 保证被volatile修饰的变量对所有线程都是可见的 禁止进行指令重排序 非原子性操作除外,也就是说i++这种操作,用volatile修饰是没办法保证同步的,需要用到AtomicInteger 为什么自增不行? 因为i++操作,是多个步骤:首先取出i的值,因为有volatile的修饰,这时候的值是没有问题的。 但是自增的时候,别的线程可能已经把i修改了比如+1,这种情况下就此线程如果写入成功就把i的值改错误了。 6、单例 经典的单例写法:(但是此方式没办法应对反射破坏) public class Singleton { //volatile保证了:1 instance在多线程并发的可见性 2 禁止instance在操作是的指令重排序 private volatile static Singleton instance; private Singleton(){} public static Singleton getInstance() { //第一次判空,保证不必要的同步 if (instance == null) { //synchronized对Singleton加全局所,保证每次只要一个线程创建实例 synchronized (Singleton.class) { //第二次判空时为了在null的情况下创建实例 if (instance == null) { instance = new Singleton(); } } } return instance; } } 枚举的单例方式可以避免反射破坏,目前正在学习其中的原理,不要zhaoji... 7、手写一下生产者和消费者模型 public class Main { private static Integer count = 0; private static final Integer FULL = 10; private static Object LOCK =new Object; public static void main(String[] args) { Main main = new Main(); new Thread(main .new Producer()).start(); new Thread(main .new Consumer()).start(); new Thread(main .new Producer()).start(); new Thread(main .new Consumer()).start(); new Thread(main .new Producer()).start(); new Thread(main .new Consumer()).start(); new Thread(main .new Producer()).start(); new Thread(main .new Consumer()).start(); } class Producer implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } synchronized (LOCK) { while (count == FULL) { try { LOCK.wait(); } catch (Exception e) { e.printStackTrace(); } } count++; Log.d("test",Thread.currentThread().getName() + "生产者生产成功,目前总共有" + count); LOCK.notifyAll(); } } } } class Consumer implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (LOCK) { while (count == 0) { try { LOCK.wait(); } catch (Exception e) { } } count--; Log.d("test",Thread.currentThread().getName() + "消费者消费成功,目前总共有" + count); LOCK.notifyAll(); } } } } } 呃... 写完突然发现,有点随意了。这些内容好像完全不相干。不管了,大家就当琐碎的知识点,学习吧当然如果文中有错误的地方,欢迎评论区之出。因为这毕竟也只是我自己的学习总结~ 推荐一个立志减少IT面试踩坑的公众号 因为身边的同学从事互联网相关职业的比较多,并且大家闲时聊天时总会吐槽找工作有很多坑,所以打算把身边同学找工作的经验,统统收集起来。提供给想从事这方面同学,希望圈内好友可以共同进步,共同少踩坑。 个人公众号

优秀的个人博客,低调大师

效率提升50倍,轻松处理大数据

阿里云流计算正式上线——新用户免费试用一个月 日前,阿里云宣布流计算(Aliyun StreamCompute,Powered by Blink)正式发布商业化版本。阿里云流计算是运行在阿里云平台上的流式大数据分析平台,提供给用户在云上进行流式数据实时化分析工具,实现对网站数据、工业化数据、物联网数据等各种场合进行实时的数据监控、分析和处理。 流计算典型架构 解决痛点 阿里云流计算可以提供BlinkSQL协助用户简单轻松完成流式计算逻辑的处理。同时,受限于SQL代码功能有限无法满足某些特定场景的业务需求,阿里云流计算提供全功能的UDF函数,帮助用户完成业务定制化的数据处理逻辑。在流数据分析领域用户直接使用BlinkSQL+UDF即可完成大部分流式数据分析处理逻辑,目前的流计算更擅长于做流式数据分析、统计、处理。主

优秀的个人博客,低调大师

Forrester:应用物联网全面提升客户体验

对于企业来说,物联网不仅蕴含着无限商机,还能够孵化出创新性的客户体验以及帮助企业实现内部的高效数字化运维。尽管许多物联网技术的发展都已经趋于成熟,但在现实中的成功部署实践仍然是屈指可数。那么对于企业的基础设施和运维(Infrastructure&Operation,I&O)专业人士来说,究竟应该采取哪些具体步骤才能够帮助企业顺利将物联网技术融入企业原有架构,从而支持业务和技术发展呢? 万物互联环境下的全新客户体验 为了帮助企业在技术采用上保持先进性,企业I&O需要不断投入资源用来发掘、测试和部署各类技术手段,帮助企业顺利完成数字化业务转型。I&O引进的新技术要不仅能够帮助企业打造全新的客户体验,还要能够帮助企业提高数字化运维效率。例如,皇家加勒比游轮海洋量子号(QuantumofTheSea)是同时实现这两个使命的典型案例。于2014年11月完成处女航的海洋量子号由皇家加勒比一手打造,建造过程融合了无数包括物联网(IoT)和可穿戴设备在内的先进技术措施,也因此被员工戏称为“智能轮船”。通过这艘轮船 皇家加勒比要为客户提供世界顶级且独一无二的体验:既要优化登船手续过程,为顾客带去更大程度的便捷,也要保证客户的体验是差别化的且令人愉悦的。 不是所有企业都是皇家加勒比 尽管皇家加勒比游轮海洋量子号的技术部署过程所展现出了令人称赞的创新性,但是它的实践过程对于其他企业来说并不具备普遍适用性,甚至其实施过程中的技术复杂性会让很多企业望而却步。这是因为: 1.大多数企业都不具备独立的技术环境; 2.大多数企业都缺少多个技术平台之间的整合能力; 3.为了部署新技术,大多数企业都必须大规模翻新现有设施; 4.大多数企业现有的网络环境都无法支持物联网的需求。 成功的IoT和可穿戴设备的部署需要长远的战略规划,确保与整个企业的商业科技(BusinessTechnology,BT)发展议程相一致。同时,尽管IoT和可穿戴所蕴含着巨大品牌和业务创新潜力,但技术自身并不能够自动为企业带来价值。Forrester推荐企业采用以 下步骤开展IoT和物联网相关的技术部署规划,简称“I&O操作条例”(I&OPACT)。对于企业I&O人员来说,I&O操作条例能够更好的帮助企业在进行技术规划的时候实现与业务目标之间的协调。 ●I-Identify,识别出受影响的关键流程。企业发展IoT的首要步骤是确定出现有工作程序中能够经由IoT方案或者可穿戴设备能够得到改善的步骤和环节。 ●O-Orchestrate,实现多部门协同。在IoT和可穿戴设备的发展部署过程中,企业I&O人员需要协同各个受影响的业务部门,包括销售主管、店铺运营管理、仓库管理和客户体验管理等。 ●P-Pilot,广泛进行新技术试点。只有通过在实际部署之前的试点工作,企业I&O才有可能预先探查出新技术方案潜在的问题。试点的关键作用在于证实该物联网解决方案的可行性,从而进一步帮助企业决定是否开展全方位部署工作。 ●A-Augment,强化现有流程。IoT和可穿戴解决方案都旨在影响企业与客户实际的互动过程。虽然这些技术解决方案都专注在对于客户的影响,但实际上它们对于企业后台的B2B流程也会产生重要影响。 ●C-Connect,连接企业关键系统。想要通过IoT和可穿戴对客户体验进行流程再造,企业需要实现新技术与后台库存管理系统和数据分析系统的整合。 ●T-Train,持续开展员工培训。对员工开展培训,明确传达有关IoT和可穿戴设备对其日常工作的影响至关重要,培训的效果将直接影响企业整体对于新技术方案的采用效果。 原文发布时间为:2016年11月4日 本文作者:J. P. Gownder, Michele Pelino 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

这10 个工具,让你效率提升

题图来自 http:// ifanr.com 百度脑图 naotu.baidu.com 百度脑图是一个在线的思维导图工具,当你创建一个节点,点击右键,就可以选择创建下级,同级的节点,当然也有很多很方便的快捷键,Enter 创建下级节点,Tab 创建同级节点,还可以标注优先级和进度。并且你所有的数据都会保存在云端,你还可以和好友一块分享。 马克飞象 maxiang.info 马克飞象是一款专为印象笔记(Evernote)打造的Markdown编辑器。配合印象笔记强大的存储和同步功能,除了基本语法,它还支持 LaTeX 公式、流程图、本地图片以及附件上传,甚至截图粘贴。还支持选择笔记本和添加标签。它同时提供Win、Mac 客户端和Chrome 离线App。 星际加速器 rallets.com 星际加速器是一款科学上网工具,它支持iOS,Android,Mac,Win 多平台,目前iOS 免费,并且不限流量,你只需下载客户端,一键就可以开启,并且可以选择多个国家的节点(需要注册账号)。 Airdroid airdroid.com 利用Airdroid,可以在PC,Mac 上管理你的Android 手机。它可以接收设备所有通知,不会错过电话、短信、邮件等重要通知,并且垃圾短信,电话,直接挂断,还可以直接回复短信。并且还可以传送文件等等很多功能,比如当你在办公的时候,可以在电脑上操作手机。甚至当你的手机丢了,也可以用它的辅助功能。 坚果云 jianguoyun.com 坚果云是一个网盘服务,在Dropbox 在国内被和谐,坚果云作为Dropbox 的替代品也再合适不过了。而它的很多功能也和Dropbox 类似。而它的特色就是同步功能,只需要一个账户,全平台的数据都会自动备份,而且它还会保留每个文件的历史版本,当你修改文档删删改改,使用它再也不用担心数据丢失了,想要查看历史版本只需从网页版找到。 锤子便签 note.t.tt 作为一个每个人都需要的便签工具,作为情怀锤出品,质量自然是不用说了,锤子便签简直太让人省心了,简洁的界面,支持Markdown,没有多余的修饰,都为它加分不少,它不仅可以输入文字,还可以插入图片,进行图文混排也在适合不过了,你可以随时随地将便签的内容生成长微博或者图片,分享出去。 Prezi prezi.com Prezi 是一个炫酷的PPT 演示制作工具,你可以使用它放大缩小来演示,还可以使用3D 效果来导航演示,还可以旋转。你可以显示所有部分,点击下一步,就显示局部的一小块,再点击下一步就跳转到另一个小部分了,而这中间的动画你都可以自定义设置,只是这效果多会让人大赞。同时还可以导入PPT 的数据。 ApkPure apkpure.com ApkPure 是一个下载Android Apk(Apk 是Android 手机安装文件) 网站。我们都知道国内的应用市场好多App 都找不到,Google Play 上不去,安装Google Play 它还挺麻烦。ApkPure 就解决了这个尴尬的境地了,你可以下载国内搜不到的Android App,以后妈妈再也不用担心我找不到Android App,同时它也有Android 客户端。 文图 wentu.io 文图是一款在线编辑的数据可视化工具。它支持上百种图标类型,文字样式,而且还有丰富的模板。只需双击就可以编辑,随时随地所见即所得的显示。它还会自动保存备份,还可以二维码分享,并且支持图片,PDF 格式输出。在所有的平台都能自动适配显示。 作者:佚名 来源:51CTO

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册