首页 文章 精选 留言 我的

精选列表

搜索[快速],共10000篇文章
优秀的个人博客,低调大师

设计模式快速学习(三)单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 优点 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 实现方式一:懒汉式(线程不安全) 懒汉式:就是用的时候再进行实例化对象。 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种实现方式不支持多线程,因为没有同步锁,多线程下不能正常工作。 实现方式二:懒汉式(线程安全) public class Singleton { private static Singleton instance; public static synchronized Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; } } 可以在多线程环境下使用,但是效率太低。 优点:一个对象初始化一次,节省内存。缺点:必须用synchronized来维持单例,没效率。 实现方式三:饿汉式(线程安全) public class Singleton { private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } } 因为它作为静态资源,所以在类装载时就被实例化 优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存。 实现方式四:双检锁/双重校验锁DCL(线程安全) public class Singleton { private static Singleton instance; public static Singleton getInstance(){ if (instance == null){ synchronized (Singleton.class){ if (instance == null){ instance = new Singleton(); } } } return instance; } } 采用双锁机制,安全且在多线程情况下能保持高性能。详细了解请点击:Java并发编程 -- 单例模式线程安全问题 实现方式五:登记式/静态内部类(线程安全) public class Singleton { private static Singleton instance; private static class SingletonHandler{ private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance(){ return SingletonHandler.INSTANCE; } } 这种方式可以说是恶汉式的变通版,SingletonHandler没有被主动使用的情况下是不会实例化Singleton对象的,所以这样做,既能达到lazy式的加载,又能保证线程安全。 实现方式六:枚举类(线程安全) public enum Singleton { INSTANCE; public void myMethod() { System.out.println("enum instance test"); } } 它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。 测试: public class Main { public static void main(String[] args) { Singleton singleton = Singleton.INSTANCE; singleton.myMethod(); } } enum instance test 总结 不建议使用第 1 种和第 2 种懒汉方式,建议使用第 3 种饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用第 5 种登记方式。如果涉及到反序列化创建对象时,可以尝试使用第 6 种枚举方式。

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

快速开始 Hello World 和 Python 之禅

image.png 环境安装 直接到官网下载对应的 OS 的版本安装即可。 https://www.python.org/downloads/ Python IDE Shell 界面 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 05:52:31) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin Type "copyright", "credits" or "license()" for more information. >>> print("Hello World") Hello World >>> import keyword >>> keyword.kwlist ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] >>> image.png 当然,我们也可以新建一个 hello_world.py 源代码文件: #!/user/bin/env python3 print("Hello World") image.png 然后,在命令行执行: $ python3 hello_world.py Hello World PS : Python 之禅 The Zen of Python >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those! Python 之禅 by Tim Peters 优美胜于丑陋(Python 以编写优美的代码为目标) 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似) 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现) 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁) 扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套) 间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题) 可读性很重要(优美的代码是可读的) 即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上) 不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码) 当存在多种可能,不要尝试去猜测 而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法) 虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido ) 做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量) 如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准) 命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)

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

linux快速找出最占用硬盘的文件

有时候某种应用程序的日志藏在文件系统的深处,不易发觉;有时候自己拷贝了一些大文件放在某个地方时间长了就忘了。那么如何在 Linux 系统上找到这些占用硬盘空间的文件呢? 首先我们可以统计一下根目录下各个目录占用硬盘的情况,找出最占用硬盘的那个目录: du -sh /* 看看 /home 下哪些用户占用了最多的空间: du -sh /home/* 我们再看看 /home/v13 下究竟哪些文件占用了空间,用下面的一行命令找出某个目录下(这里是 /home/v13)大小超过 500MB 的文件(打印前40行并按照 MB 从小到大排列): # find /home/v13 -printf "%k %pn" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 40

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

使用Sublime Text快速编译运行java程序

终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 1、实现sublime Text 3对java编译执行 1.1直接在安装路径下找到*\Packages\Java.sublime-package文件,用解压缩软件打开,找到JavaC.sublime-build文件,将shell_cmd中的javac改成javaRun,保存后将原压缩文件中的文件替换,如果你的sublime text 3已经打开,会报错,关闭后再次覆盖。代码如下: [plain] view plain copy { "shell_cmd":"javaRun\"$file\"", "file_regex":"^(...*?):([0-9]*):?([0-9]*)", "selector":"source.java", "encoding":"cp936" } 1.2然后在jdk安装路径下的bin目录中新建一个javaRun.bat批处理文件,内容如下: [plain] view plain copy @ECHOOFF cd%~dp1 ECHOCompiling%~nx1....... IFEXIST%~n1.class( DEL%~n1.class ) javac%~nx1 IFEXIST%~n1.class( ECHO-----------OUTPUT----------- java%~n1 ) 1.3之后就可以使用 ctrl+B 2、若显示编译显示[Decode error - output not utf-8]【注:需要在前面的基础下】 SublimeText3\Packages\Java.sublime-package\JavaC.sublime-build\ 3、编译显示: 编码GBK的不可映射字符【注:需要在前面的基础下】 [Decode error - output not cp936] 有采用 :http://jingyan.baidu.com/article/ca2d939dc76c89eb6c31ce96.html 用记事本打开,另存为ANSI编码,但依旧感觉不好受,所以是有如下方法: 将上述javaRun.bat修改为: [plain] view plain copy @ECHOOFF cd%~dp1 ECHOCompiling%~nx1....... IFEXIST%~n1.class( DEL%~n1.class ) javac-encodingUTF-8%~nx1 IFEXIST%~n1.class( ECHO-----------OUTPUT----------- java%~n1 ) [plain] view plain copy

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

简单快速搭建Exchange 2013 服务器

部署搭建Exchange 2013服务器简单可以为为三个步骤 1. 准备Active Directory 2. 在服务器上安装的Exchange Server 2013的先决条件 3.运行Exchange Server 2013安装程序 当你第一次安装Exchange Server 2013,需要准备Active Directory。 域准备需要满足条件 架构主机运行Windows Server 2003 SP2中,或Windows Server更高版本 每个站点至少安装一台全局编录服务器Exchange服务器,运行版本Windows Server 2003 SP2或更高版本 在每个站点将被安装在至少一台域控制器运行版本Windows Server 2003 SP2或更高 林功能级别需要Windows Server 2003或更高的 运行Exchange安装程序管理账号需Schema Admins, Domain Admins, and Enterprise Admins 管理权限 可以单独为每一台Exchange 2013 服务器准备Active Directory 操作系统最好运行在Windows Server 2008 or higher. 现在我们以版本匹配最好Window Server 2012 来搭建Exchange 2013 安装在Window Server 2012必要条件 Exchange 2013 有三种服务器角色 分别是EXCHANGE SERVER 2013 MAILBOX、CLIENT ACCESS SERVER、Edge Transport 由于边缘传输服务器角色需要安装先决条件很小这里就不讨论了,下面分别看看EXCHANGE SERVER 2013 MAILBOX和CLIENT ACCESS SERVER 角色 EXCHANGE SERVER 2013 MAILBOX 安装先决条件 打开Windows PowerShell 运行以下命令: Import-Module ServerManager Install-WindowsFeature AS-HTTP-Activation, Desktop-Experience, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation 重启服务器完成安装 下一步以下顺序安装软件 Unified Communications Managed API 4.0 Runtime http://www.microsoft.com/en-us/download/details.aspx?id=34992 Microsoft Office 2010 Filter Pack 64 bit http://www.microsoft.com/en-us/download/details.aspx?id=17062 Microsoft Office 2010 Filter Pack SP1 64 bit http://www.microsoft.com/zh-cn/download/details.aspx?id=26604 CLIENT ACCESS SERVER安装先决条件 打开Windows PowerShell 输入以下命令: Install-WindowsFeature AS-HTTP-Activation, Desktop-Experience, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation 重启服务器完成角色和功能安装 下一步安装下面软件 Unified Communications Managed API 4.0 Runtime 现在我们最简单方式搭建部署Exchange 2013,即单林单域基础上,部署典型架构 第一步: DC上扩展架构, 插入Exchange 2013 光盘,进入安装目录,运行如下命令扩展AD架构 .\setup /Preparead /IAcceptExchangeServerLicenseTerms /OrganizationName:"Enter Exchange Org Name" 第二步:Preparing Schema .\setup /PrepareSchema /IAcceptExchangeServerLicenseTerms 第三步:Preparing Domain即本地域 .\setup /Preparedomain /IAcceptExchangeServerLicenseTerms 第四步:运行Exchange 2013安装向导 第五步:接受协议选择下一步 第六步:选择下一步 第七步:选择服务器角色 第八步:选择下一步 第九步:选择安装 第十步: 根据提示重启计算机,完成服务器角色安装 本文转自惊艳了青春 51CTO博客,原文链接:http://blog.51cto.com/djclouds/1618981,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

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

用户登录
用户注册