- 博客(44)
- 资源 (2)
- 问答 (1)
- 收藏
- 关注
原创 Kerberos认证报错:Failed to find any Kerberos tgt 的处理
JDK认为Kerberos使用的加密算法比较弱,不承认加密出来的密钥。例如在JDK1.8_351中,默认不支持DES相关的Kerberos 5加密算法。如tgt缓存文件不存在,已过期,jdk版本过老等问题,这就不多说了。但较低的、121版本就支持。
2023-05-25 20:33:29
3091
原创 原来ConcurrentHashMap里有这么多知识点
文章目录引言知识点CHM如何存储数据什么时候初始化存储空间如何计算空间大小什么时候需要扩容扩容时的写入和读取什么时候需要加锁读取时为什么不用加锁sizeCtl的作用计算索引引言最近给公司整理面试题,想起了Java里鼎鼎大名的ConcurrentHashMap(以后简称CHM)。原本以为懂了扩容(2n2^n2n)、单节点加锁、冲突红黑树就行了,结果一搜资料,再对比一下源码,发现原来还是有很多以前没留心过的知识点。所以在这里好好总结一下。知识点CHM如何存储数据Node<K, V>[]
2022-08-17 23:00:06
469
原创 ConcurrentHashMap的扩容
ConcurrentHashMap(以下简称CHM)扩容的实现非常精妙,可以说是CHM的精髓所在。它可以在不启用额外线程的情况下,借用已有的线程实现快速扩容,同时还可以保证线程安全。下面我们不妨带着下面这几个问题一块儿来看看CHM的源码。...
2022-06-04 00:45:53
5614
原创 ConcurrentHashMap源码分析之计数:addCount、fullAddCount、size
ConcurrentHashMap(以下简称CHM)的计数比较有特色,跟很多实现不同的是,CHM并没有一个专门的属性数据,在实现上也没有用锁来同步。那么它到底是怎么实现的呢?CHM计数的总体原理CHM在实现计数时,主要借助的是baseCount和counterCells(数组)两个属性。baseCount是原生类型long,默认值0LbaseCount在首次添加元素的时候设置为1视并发情况的不同,可能在addCount中赋值,也可能在fullAddCount中赋值,且仅赋值一次counterC
2022-05-29 20:56:30
811
原创 C++ 11的enable_shared_from_this
C++ 11的提供了一个模板类std::enable_shared_from_this。目的为安全获取当前对象的shared_ptr提供方便。原因一般在对象的函数中,是不可以返回一个指向this指针的shared_ptr。因为如果当前对象已经析构,当shared_ptr再次析构时,因为其管理的指针已经不再合法,所以会导致Undefined行为。如果实在有这种需求,就应该使用std::enable_shared_from_this提供的shared_from_this方法获取。使用class S
2022-05-06 23:55:28
381
原创 【解决】g++: error trying to exec ‘cc1plus’: execvp
项目场景:Linux编译安装gcc找不到cc1plus问题描述g++: error trying to exec ‘cc1plus’: execvp:原因分析:网上很多说gcc和g++版本不匹配,说重新安装的。拜托,不要再抄袭了。实际在linux系统中无法执行某个程序,要么是目标文件真不存在,要么存在,但是当前用户权限不足编译安装的gcc,由于要安装到/usr/local,所以需要高权限的用户。这时大家一般喜欢使用sudo make install。这里比较容易出现问题,sudo之后
2022-05-03 10:44:26
1873
原创 Spring Boot的初始化过程
Spring Boot的初始化过程Spring Boot是开发微服务的不二利器。它遵从Convention over Configuration原则,看上去非常简约,但实际底下却做了很多工作。本文从Spring Boot应用程序的初始化过程入手,讲解一下其实现细节。 一般Spring Boot的应用都是从main函数开始,调用SpringApplication.run函数。SpringApplic
2017-04-21 12:27:51
1949
转载 【转帖】计算机体系结构——存储体系
http://blog.csdn.net/iwainfo/archive/2004/12/14/216228.aspx本章重点是页式虚拟存储器映象及地址变换过程;LRU,FIFO的替换算法;LRU的堆栈分析过程;Cache组相联地址映象和LRU块替换;虚存,Cache的性能分析,要求达到综合应用的水平。本章是重点章。要求掌握的基本概念有:LRU,FIFO ,全相联、直接映象,组相联,快表、命中
2008-05-28 12:57:00
1595
原创 初始化与赋值是不同的操作
l 赋值仅发生在调用赋值运算符时,l 初始化涉及较广,包括声明变量、函数返回、参数传递、异常捕捉。 对于built-in类型,int、char、double、float等,赋值和初始化没有什么不同,都是向指定内存中复制数值。但是对于用户自定义的类型,则有更多的事情要做,特别是类对象,赋值操作在通常情况下是先将当前对象析构,然后再根据右值重新构造新的对象。
2008-05-19 21:44:00
591
原创 System.StackOverflowException异常
按照MSDN的解释,这个异常在有很多正在被调用的函数时抛出。而从实践角度来讲,通常是因为递归层次过深造成的。最好在抛出异常的CallStack中检查一下有没有循环递归调用。特别是那种A调B,B又调A,而且没有终结条件的那种代码。
2008-05-09 21:07:00
1635
原创 能用if- else/throw-exception进行错误/异常处理的地方就不要用assert。
首先我们要明确assert的作用,它是在Debug版中断言某种状态或值,或者说在那一时刻,软件应该是某种状态,变量的值也是预期的。因此,从这个意义上说,应该使用assert的地方如果再加入if-else的错误处理就是画蛇添足、违反逻辑了。或许有人会说:”assert只在Debug版本中有效,那Release版怎么办?”l 用if-else。既然Release版有错误处理的需要,那么只
2008-05-07 14:52:00
3681
原创 异常安全的函数(方法)
所谓异常安全的函数是指:即便是在这个函数的调用过程中出现异常,也不会影响到重要的数据或状态。【异常安全原则】:尽量把可能抛出异常的代码写在函数的最前面,让异常尽量早地抛出,在改变重要数据或状态之前抛出异常。 让我们来比较两段代码:void f1(){ importantData.Invalidate(); data = getNewDat
2008-04-29 17:44:00
643
原创 尽量用C++的新式cast,而不是C的旧式cast
1. C++的cast精准,而C的cast模糊类型转换是经常出问题的地方,需要小心运用,尽量避免模糊的语义。l C式的cast,形似type(…),与非cast形式的构造函数调用相同,不易区别。l C式的cast功能强大,甚至可以将const变量转换成非const的变量,而调用者却毫无察觉,非常危险。const int a = 123;int b = (i
2008-04-25 21:03:00
525
原创 常引用(const reference)
一般引用只能初始化为变量的引用,不能是字面常量或临时变量(如函数返回值)。但常引用可以。如: const int &a = 123; const int &b = RefFun();特别是如果函数的参数声明为const reference,也可以传入字面常量。template T add( const T &a, const T &b )
2008-04-23 21:57:00
887
转载 商业计划书的写法
商业计划书最好就是十页篇幅:第一页是市场介绍;第二页分析市场问题;第三页写解决问题的方式;第四页调研市场;第五页分析竞争对手;第六页介绍核心竞争力;第七页写盈利模式;第八页写近期目标;第九页写资金预算;第十页就介绍团队。
2008-04-23 17:35:00
866
原创 函数模板参数推导的两个经典应用
1. 推导数组参数。【可以分别推导出“元素类型”和“数组长度”】// 模板函数定义templateint bound, typename T>void f1( T (&ary)[bound] ){ T x; for(int i=0; ibound; i++ ) { x = ary[i]; }}
2008-04-23 17:31:00
1512
原创 线程局部存储(TLS)的使用
开辟一块儿存储区,用以存储全局数据,虽然是全局数据,但对各个线程又各不相同,每个线程都可以在这块儿区域存储只对自己有效的数据。l 适用情形:线程局部存储适用于多线程共享数据,而又不需要同步的情形。(线程同步的开支比较大。) l 原理在每个线程中有一个存储区域,该存储区域有64个slot(数据槽)。可以通过该slot的索引值(一个DWORD数值),获取指定的slot。每个sl
2008-04-21 13:38:00
897
转载 使用内存映射文件处理大文件
作者: 郎锐 出处:中国电波传播研究所 引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的
2008-04-21 11:24:00
577
原创 STLport介绍
STLport是一个以SGI STL为蓝本的STL实现。它对SGI STL做了一次包装,并针对各个平台和编译器进行了优化,以便在各个平台上都能使用强大的SGI STL。STLport可以到SourceForge网站上下载。目前(2008.4)最新的版本是5.1.2。本文后面的叙述也是针对该版本。SGI STL本身虽然很强大,但它是SGI公司针对其UNIX的变体IRIX而设计的,在其它
2008-04-14 18:12:00
3624
原创 Vector使用时要注意的地方
1. Vector的iterator是一个指针。因为vector其实是一段连续的内存空间,用指针即可以实现vector的遍历。2. 不能保持iterator以备后用。在增加元素时,一旦现有空间不足,就会重新分配,这就会导致原有的指针不再有效。3. Vector中的元素必须具有缺省构造函数、拷贝构造函数和赋值运算符。
2008-04-09 12:46:00
769
原创 __type_traits 编程纪要
Type Traits即类型属性。C++类型本身不具有某些我们感兴趣的属性信息,例如(拷贝)构造、析构函数,以及赋值运算符是否Trival,所以我们应当采用某些手段来记录这些信息。这些信息有助于针对某种类型选择最佳的方法。当然我们也可以在类中添加字段来记录这些信息,但这样一来增加了类的负担,二来只能在运行时访问,影响效率。最好的方式当然是在编译时刻就能确定。 先给出SGI STL中_
2008-04-08 16:40:00
1056
原创 几种计算时间的方法
1. 响应WM_TIMER消息。精度非常低,最小 计时精度仅为30ms。2. Sleep()函数,精度也是30ms。3. 利用COleDateTime类和COleDateTimeSpan类,结合WINDOWS的消息处理过程,精度秒级。4. GetTickCount()函数,获取从系统启动开始到现在花去的时间。精度度比WM_TIMER消息映射高,在较短的定时中其计时误差为15ms,在较
2008-04-07 17:30:00
4134
原创 虚函数表存储位置
显然,一个类的所有对象拥有的虚函数都应该相同,不同的只是调用虚函数时传入的对象指针(this指针),所以应该是一个类一个虚函数表。那么应当将虚函数表存在什么地方呢?大多数编译器采取如下的策略:将虚函数表存储在其类的Object File中,并且该Object File拥有第一个非内联、非纯虚的虚函数的定义。注意:一个类可能有多个Object File,
2008-04-03 14:32:00
937
原创 防止C++的类被继承
核心解决方法: 让目标类T,虚继承基类B。(虚继承迫使虚基类的任何层次的子孙都要显式地初始化虚基类。) B的构造函数私有, T是B的友元类。 实现方法:1. class T; class B{ friend class T; private: B() {} B(const
2008-03-13 14:12:00
2357
2
原创 虚基类的初始化
假设有如下的类:基类B,虚继承派生类D1, D2, 最终派生类F,多继承自D1, D2。 1. B的直接派生类,D1和D2,其初始化列表中要显式地调用B的构造函数;2. B的间接派生类,F,其初始化列表也要显示的调用B的构造函数。这是因为虚拟派生过程中,只有一个虚拟基类的子对象,不能因为多重派生,而对该子对象进行多次,甚至相互矛盾的初始化。因此,只能在最终派生类F中显示的初始化
2008-03-13 13:55:00
1138
原创 GDI+中的变换
在GDI+中绘图时,其坐标是相对Graphics坐标系中的坐标。改变Graphics坐标系的原点、方向,Graphics中绘制的图形、图像也会随之而改变。因此,对图像、图形进行变换时,可以不必像GDI中先计算它们变换后的坐标,再按照新的坐标绘制,而仅仅需要对Graphics坐标系进行变换。
2008-02-22 14:51:00
504
原创 双缓冲技术:Double Buffering
适用情况:要绘制一张由众多小图组成的大图,及逐次绘制各个小图而形成一张大图。核心步骤:1. 先在内存中构造一张大图的对象,2. 然后将各个小图绘制到这个内存大图中,3. 最后再一次性地将大图绘制显示器或打印机等外围设备上。原理分析:如果不采用双缓冲技术,每个小图都直接绘制到外围设备,则每次都要进行设备切换,甚至存在用户态到管态
2008-02-22 14:49:00
653
原创 COM聚合的实现
聚合指的是COM对象转接客户端对某个接口的请求。某COM对象B并不实现ISomeInterface接口,但是可以通过调用某个内部COM对象A来支持该接口。意思是指,当客户端调用B所支持的接口IOtherInterface查询ISomeInterface时,直接将对象A的ISomeInterface接口指针传出去。实现聚合的关键是COM对象在被聚合时的QueryInterface的处理。按照
2008-01-11 00:03:00
687
原创 COM聚合的实现
聚合指的是COM对象转接客户端对某个接口的请求。某COM对象B并不实现ISomeInterface接口,但是可以通过调用某个内部COM对象A来支持该接口。意思是指,当客户端调用B所支持的接口IOtherInterface查询ISomeInterface时,直接将对象A的ISomeInterface接口指针传出去。实现聚合的关键是COM对象在被聚合时的QueryInterface的处理。按照
2008-01-11 00:03:00
471
原创 COM的内存管理
第一种方法,直接使用IMalloc接口进行内存管理。调用CoGetMalloc函数获取IMalloc接口指针。HRESULT CoGetMalloc(DWORD dwMemContext, IMalloc **pMalloc) ;dwMemContext参数指明内存的管理方式,一种是分配的内存仅在本进程内有效, MEMCTXT_TASK。另一种是跨进程共享,MEMCTXT_SHARE。
2008-01-10 23:05:00
785
原创 进程内COM组件的创建过程
1. 客户程序首先调用CoCreatInstance,CoCreateInstanceEx,或者CoGetClassObject,实际上前两个函数都是经过包装过的辅助函数,其内部都是通过调用CoGetClassObject实现的。2. CoGetClassObject函数中根据CLSID参数,查找注册表,找到组件所在的DLL文件。3. CoGetClassObject调用DLL中的DllG
2008-01-09 23:38:00
676
原创 C++ reference is implemented as a pointer internally.
Internally, a reference is generally implemented as pointer and the object syntax transformed into the indirection required of a pointer. [ P23, Inside the C++ object model]But, logically, we can stil
2007-11-08 23:02:00
407
原创 The memory size of a C++ object instance.
The accumulated size of its nonstatic data members. The static data memvers, like the member functions, are stored in global space. Plus any padding due to memory alignment constraints or
2007-11-08 22:53:00
462
Java对象与JSON的互转
2012-04-10
Clickhouse在ubuntu编译时遇到的奇怪问题?
2021-08-01
TA创建的收藏夹 TA关注的收藏夹
TA关注的人