边边角角
文章平均质量分 69
闲扯
GeorgiaStar
世上无难事,只要肯放弃
展开
-
用代码实现生产者消费者模型
用代码实现生产者消费者模型,3个生产者每隔3秒生产1个单位的数据,2个消费者每隔1秒消费一个单位的数据,共享资源有界。要求不能出现死锁或者占用CPU不释放的情况。原创 2021-09-06 19:02:47 · 835 阅读 · 0 评论 -
数据结构如何造就Redis的快
作为一种键值数据库,为啥Redis能有这么突出的表现呢?一方面,这是因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快。另一方面,这要归功于它的数据结构。键值对(key-value对)是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作,高效的数据结构是Redis快速处理数据的基础。Redis中的键的类型只能为String(字符串),值支持五种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Sorted Set(有序集合,也叫Zs原创 2021-08-16 15:20:18 · 396 阅读 · 0 评论 -
为什么组合优先于继承
面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。同样地,在《阿里巴巴Java开发手册》中有一条规定:谨慎使用继承的方式进行扩展,优先使用组合的方式实现。为什么不推荐使用继承每个人在刚刚学习面向对象编程时都会觉得:继承可以实现类的复用。所以,很多开发人员在需要复用一些代码的时候会很自然的使用类的继承的方式,因为书上就是这么写的。继承是面向对象的四大特性之一,用来表示类之间的is-a关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的原创 2020-09-17 18:48:42 · 11673 阅读 · 8 评论 -
ThreadLocal及其内存泄露分析
ThreadLocalThreadLocal是一个线程本地变量,作用主要是做数据隔离。ThreadLocal中填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,每个线程维护自己的变量副本,多个线程互相不可见,因此多线程操作该变量不必加锁,适合不同线程使用不同变量值的场景。数据隔离有什么用,用在哪些场景?一个典型的应用场景就是Spring事务,事务是和线程绑定起来的,Spring框架在事务开始时会给当前线程绑定一个JDBC Connection,整个事务过程都是使用该线程绑定的conne原创 2020-08-17 20:33:09 · 521 阅读 · 0 评论 -
面向对象及软件设计原则总结
面向对象现在,主流的编程范式或者编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。现在比较流行的编程语言大部分都是面向对象编程语言。大部分项目也都是基于面向对象编程风格开发的。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。面向对象四大特性理解面向对象编程及面向对象编程语言的关键就是理解其四大特性:封装、抽象、继承、多态。不过,对于这四大特性,光知道它们的定义是不够的,我们还转载 2020-05-15 16:30:10 · 1664 阅读 · 0 评论 -
动态链接库与静态链接库的区别
大家都知道应用程序有两种链接方式,一种是静态链接,一种是动态链接,这两种链接方式各有好处。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。动态链接是相对静态链接而言的,动态链接所调用的原创 2017-01-19 15:19:47 · 10369 阅读 · 1 评论 -
Java编程热门问题总结——编程技巧篇
经过多种渠道的搜集,对Java程序员在编程过程中常见的问题及解答作一个整理。1、去掉烦人的“!=null”(判空语句) 为了避免空指针调用,我们经常会看到这样的语句:if (someobject != null) { someobject.doCalc();} 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 这是初、中级程序猿经常会遇到的翻译 2017-06-02 10:26:31 · 1093 阅读 · 0 评论 -
JVM内存结构与垃圾回收总结
1、JVM内存模型 JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令。正如任何一个操作系统进程那样,JVM也需要内存来完成它的运行时操作。记住:JVM本身是硬件的一层软件抽象,在这之上才能够运行Java程序,也才有了我们所吹嘘的平台独立性以及“一次编写,处处运行”。 Java虚拟机在执行Java程序的过程中会把它说管理的内存划分为若干个不同的数据区域,如下面两图所示原创 2020-02-21 17:22:40 · 7874 阅读 · 4 评论 -
Java编程热门问题总结——基础语法篇
经过多种渠道的搜集,对Java程序员在编程过程中常见的问题及解答作一个整理。1、Java += 操作符实质 我之前以为: i += j 等同于 i = i + j; 但假设有:int i = 5;long j = 8;1212 这时 i = i + j 不能编译,但 i += j 却可以编译。这说明两者还是有差别的,这是否意味着i += j实际上等同于 i= (type of原创 2017-06-01 11:17:06 · 910 阅读 · 0 评论 -
分布式锁原理及实现方式
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性转载 2017-10-30 20:51:21 · 1209 阅读 · 0 评论 -
Java性能优化:30个小细节,提升Java代码运行效率
代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。 代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优转载 2017-10-08 12:35:31 · 5105 阅读 · 0 评论 -
基于Zookeeper实现分布式锁
实现分布式锁目前有三种流行方案,分别为基于数据库、Redis、Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开。我们来看下使用Zookeeper如何实现分布式锁。什么是Zookeeper?Zookeeper(业界简称zk)是一种提供配置管理、分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功能而且要达...转载 2019-07-08 21:33:30 · 2448 阅读 · 0 评论 -
什么样的对象才能作为STL容器的元素
这是在使用STL容器前必须搞清楚的一个很重要的问题!STL容器采用拷贝方式来接收待插入的元素对象——在插入的时候容器自动新建等量的元素对象,并用待插入对象依次初始化它们(调用拷贝构造函数);在删除元素时,容器负责释放其内存资源(对于采用随机存储策略的容器,如list和关联容器)或者仅仅调用元素的析构函数(对于采用连续存储策略的容器,如vector)。容器只负责其元素对象本身一级的存储分配与原创 2017-03-01 17:06:36 · 1335 阅读 · 1 评论 -
c++对象模型详解之一——《深度探索C++对象模型》
《深度探索C++对象模型》读书笔记转载 2017-02-27 13:29:33 · 492 阅读 · 0 评论 -
编译型语言和解释型语言
计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。编译型语言在程序执行之前,会先通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C/C++语言。解释型语言就没有这个编译的过程,而是在程序运行原创 2017-01-19 14:48:02 · 749 阅读 · 0 评论 -
C++关于内存与参数传递的几道思考题
经典测试代码如下:void GetMemory(char *p){ p = (char *)malloc(100); }void Test(void) //1 { char *str = NULL; GetMemory(str); strcpy(str,"hello world"); printf(str);}char *GetMemory(void){ ch原创 2017-01-19 15:22:12 · 659 阅读 · 0 评论 -
C语言中的类型转换与数据的机器码存储
各种类型的表示范围对于涉及到了混合着不同数据类型的表达式中的数据类型的转换问题。在总结转换问题之前,先说明一下32位机上的各种数据类型。类型名字节数其他类型名10进制表示范围(机器码)char1signed char-128—127(0X80-0X7F)uns原创 2017-01-19 15:24:24 · 5177 阅读 · 1 评论 -
Java存储模型与共享对象
很多程序员对一个共享变量初始化要注意可见性和安全发布(安全地构建一个对象,并其他线程能正确访问)等问题不是很理解,认为Java是一个屏蔽内存细节的平台,连对象回收都不需要关心,因此谈到可见性和安全发布大多不知所云。其实关键在于对Java存储模型,可见性和安全发布的问题是起源于Java的存储结构。Java存储模型原理有很多书和文章都讲解过Java存储模型,其中一个图很清晰地说明了其存储结构:由上图可知转载 2017-03-02 09:44:11 · 780 阅读 · 0 评论 -
Java final变量与final类的内存模型
对于 final 域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个 final 域的写,与随后把这个构造对象的引用赋值给一个变量,这两个操作之间不能重排序初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序举个例子:public class FinalExample { int i;// 普通变量原创 2017-03-02 10:13:14 · 892 阅读 · 0 评论 -
线程安全与可重入函数
线程安全函数与可重入函数线程安全函数 • 概念: 线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。 • 确保线程安全: 要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄 存器。因此,对于同一进程的不同转载 2017-03-04 19:59:30 · 310 阅读 · 0 评论 -
c++对象模型详解之二——《深度探索C++对象模型》
《深度探索C++对象模型》读书笔记转载 2017-02-27 13:32:30 · 324 阅读 · 0 评论 -
静态语言与动态语言
静态语言是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。例如:C++、Java、Delphi、C#等。动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。例如:Python、Ruby、Perl、JavaScript等。强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经原创 2017-01-19 14:52:53 · 1160 阅读 · 0 评论