请参阅此https://en.wikipedia.org/wiki/Double-checked_locking,我们有:
// "Double-Checked Locking" idiom
class Foo {
private Helper helper;
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
// other functions and members...
}
Run Code Online (Sandbox Code Playgroud)
第二次测试的目的是什么?2个线程是否真的可以同时访问同一个关键部分?
拥有这个泛型代码
\n\nstatic final <T> List<Class<? extends T>> findSubClasses(Class<T> clz, String packageName){\n ClassPathScanningCandidateComponentProvider provider =\n new ClassPathScanningCandidateComponentProvider(false);\n provider.addIncludeFilter(new AssignableTypeFilter(clz));\n Set<BeanDefinition> beanDefinitions = provider.findCandidateComponents(packageName);\n List<Class<? extends T>> subClasses = beanDefinitions.stream().map(b->mapToClass(b, clz)).collect(Collectors.toList());\n return subClasses;\n}\n\nprivate static final <T> Class<? extends T> mapToClass(BeanDefinition beanDefinition, Class<T> clz) {\n String className = beanDefinition.getBeanClassName();\n try {\n return (Class<? extends T>) Class.forName(className);\n } catch (ClassNotFoundException e) {\n log.error("Failed to load the scanned class {}", className, e);\n }\n return null;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我在b->mapToClass(b, clz)
Bad\xc2\xa0return\xc2\xa0type\xc2\xa0in\xc2\xa0lambda\xc2\xa0expression:\xc2\xa0Class<capture\xc2\xa0of\xc2\xa0?\xc2\xa0extends\xc2\xa0T>\xc2\xa0cannot\xc2\xa0be\xc2\xa0converted\xc2\xa0to\xc2\xa0Class<Object>\nRun Code Online (Sandbox Code Playgroud)\n\n如何解决这个问题?
\n根据这个问题
许多键值对可以存储在同一个存储桶中(在使用哈希计算存储桶的索引之后),当我们调用get(key)它时,查看链表并使用equals方法进行测试.
这对我来说听起来并没有真正优化,是不是hashCode在使用之前比较链接List的s equals?
如果答案是否定的:
它意味着大多数时间桶只包含1个节点,你能解释一下原因吗?因为根据这个逻辑解释,许多不同的键可以具有相同的桶索引.
如何实现确保密钥的良好分配?这可能意味着存储桶表大小是相对于键的数量
即使Table Bucket大小等于键的数量,HashMap hashCode函数如何确保键的良好分配?不是随机分布?
我们可以有更多细节吗?