java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit 所以可以看到数组和普通的Java对象头部是有区别的。 List-4 import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.vm.VM; /** * @author dmj1161859184 System.out.println(layout.toPrintable()); } public static class A { boolean f; } } List 图3 List-4的运行结果 List-5 import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.vm.VM; /** *
2 InMemoryClientDetailsService package org.springframework.security.oauth2.provider.client; import java.util.HashMap ; import java.util.Map; import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.security.oauth2 + clientId); } return details; } 如List-3,用jdbcTemplate从数据库中查询,来看下selectClientDetailsSql,如下List -4 List-4 select client_id, client_secret, resource_ids, scope, authorized_grant_types, web_server_redirect_uri
return nextc == 0; } } } CountDownLatch里面有个内部类Sync继承了AbstractQueuedSynchronizer——这个类在java.util.concurrent.locks tryAcquireShared方法在类Sync中实现,如List-1中,当还有线程还未执行完,tryAcquireShared会返还-1,这样就调用doAcquireSharedInterruptibly()如List InterruptedException(); if (tryAcquireShared(arg) < 0) doAcquireSharedInterruptibly(arg); } List Reference http://openjdk.java.net/
8303698.html,而后自己结合hotspot源码看的 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long arg1, java.lang.Object arg2, java.lang.Object arg3); compareAndSwapInt(java.lang.Object arg0 , long arg1, int arg2, int arg3); compareAndSwapLong(java.lang.Object arg0, long arg1, long arg2, long arg3); 来看下openJDK8的hotspot中,unsafe是如何实现的,链接http://hg.openjdk.java.net/jdk8u/jdk8u60/hotspot/file/37240c1019fd 中,如下List-4所示 List-4 jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value
-3,1处和2处,会将ZuulProperties中sensitiveHeaders的值加入到要过滤的字段里面,来看下ProxyRequestHelper的addIgnoredHeaders方法,如下List name.toLowerCase());//1 } for (String name : names) { set.add(name.toLowerCase());//2 } } List 调用isIncludedHeader方法,isIncludedHeader里面获取RequestContext,判断当前的这个header key是不是在IGNORED_HEADERS这个集合里面——List context.getZuulRequestHeaders()获取我们手动设置的header(调用addZuulResponseHeader方法设置),之后逐个遍历,如果在IGNORED_HEADERS这个集合里面——List 要注意的是,如果要往下游传的header含有大写的,那么下游接收到的header是小写的,原因在List-4中可以看出。 Reference 源码
Object target); void setProperties(Properties properties); } 来看PageInterceptor如何实现intercept接口的,如下List -4 List-4 @Override public Object intercept(Invocation invocation) throws Throwable { try { List-4中如果不需要分页,则直接调用executor的query方法。 List-4中,需要count查询后,判断手写的count已存在,不存在则调用mybatis的builder等工具类构造,之后进行count查询,得到结果后调用dialect的afterCount方法, else if(page.isOrderByOnly()){ page.setTotal(pageList.size()); } return page; } List
先来定义实体类,如下List-3和List-4 List-3 Department.java /** * @author dmj1161859184@126.com 2018-09-18 01:21 this.name = name; this.officeStaffs = officeStaffs; this.strings = strings; } } List -4 OfficeStaff.java /** * @author dmj1161859184@126.com 2018-09-18 01:22 * @version 1.0 * @since \"com.mjduan.project.objectRedisTemplate.model.Department\",\"name\":\"System\",\"officeStaffs\":[\"java.util.ArrayList
getHandlerInternal的实现在AbstractHandlerMethodMapping中,如List-3所示 获取request中的url 调用lookupHandlerMethod方法获取HandlerMethod,如List handlerMethod.createWithResolvedBean() : null); } finally { this.mappingRegistry.releaseReadLock(); } } List return handleNoMatch(this.mappingRegistry.getMappings().keySet(), lookupPath, request); } } 如List 回到List-3,在List-4中返回HandlerMethod后,调用getHandlerExecutionChain方法构造一个HandlerExecutionChain,读者可以去看下HandlerExecutionChain
并将每个类封装为Resource,如下List-3,之后将每个resource转换为MetadataReader,仔细看下1处isCandidateComponent(metadataReader)的处理,如下List -4,在List-4中,includeFilters默认添加了new AnnotationTypeFilter(Component.class),这意味着isCandidateComponent()方法中调用 BeanDefinitionStoreException("I/O failure during classpath scanning", ex); } return candidates; } List scanning"); } catch (ClassNotFoundException ex) { // JSR-250 1.1 API (as included in Java
generation = new Generation(); } 2.reset()方法 await()被调用n次后,计数器已经变为0了,此时再次使用await()不行,需要使用reset()来重置计数器 List trip.signalAll(); // set up next generation count = parties; generation = new Generation(); } List Reference http://openjdk.java.net/ (adsbygoogle = window.adsbygoogle || []).push({});
安装JDK,步骤略, List-1 mjduan@mjduan-ubuntu:~$ java -version java version "1.8.0_111" Java(TM) SE Runtime Environment (build 1.8.0_111-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode) 安装Spark,下载地址 List-4 mjduan@mjduan-ubuntu:~$ tail -f ~/.bashrc ...... WARN NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111) Type in expressions to have them evaluated.
; } else { return new LinkedList<T>(); } } defaultStrategies是DispatcherServlet的一个属性,它的初始化如下List -4所示, List-4 defaultStrategies的初始化源码 private static final Properties defaultStrategies; static { // 图3 文件DispatcherServlet.properties的内容 List-3中的createDefaultStrategy(context, clazz),代码如下List-4所示。 List-4 方法createDefaultStrategy的源码 protected Object createDefaultStrategy(ApplicationContext context,
afterPropertiesSet() { initHandlerMethods(); } 由List-3知道afterPropertiesSet调用了initHandlerMethods(),如下List List-4中的handlerMethodsInitialized是空方法,不用管。 List-4 protected void initHandlerMethods() { if (logger.isDebugEnabled()) { logger.debug("Looking detectHandlerMethods(beanName); } } } handlerMethodsInitialized(getHandlerMethods()); } 来看List
RequestInterceptor接口,之后交给Spring容器,feign会自动加上这个拦截器,这个的实现也在FeignClientFactoryBean中,在configureUsingConfiguration方法中,如下List -4 List-4 Map<String, RequestInterceptor> requestInterceptors = context .getInstances(this.contextId = null) { builder.requestInterceptors(requestInterceptors.values()); } List-4中的context.getInstances
mysql.service文件末尾加入如下List-3中的内容 List-3 LimitNOFILE=65535 LimitMEMLOCK=65535 3.编辑/etc/mysql/my.cnf,加入List -4中的内容 List-4 [mysqld] max_connections=600 4.执行命令 List-5 sudo systemctl daemon-reload 5.重启MySQL之后,查看
怎么在ingress中使用这个secret呢,如下List-4,在annotations中使用我们创建好的secret List-4 apiVersion: networking.k8s.io/v1beta1
让线程池去创建新的线程 此时线程数量大于等于maxSize,将task放入任务队列中 EagerThreadPoolExecutor继承ThreadPoolExecutor,改写execute()的实现: List ()中被调用的,分别在Runnable.run()的前后被调用,而且线程池中抛出异常,在线程池外面是捕获不到的,所以外面需要的afterExecute()中将task数减去1 改进:我们可以将List https://github.com/apache/dubbo/blob/fb5761683729f63c715e39c78a8b7b75278050c9/dubbo-common/src/main/java /org/apache/dubbo/common/threadpool/support/eager/EagerThreadPoolExecutor.java
HttpServletResponse的重定向 如果满足步骤1的要求,那么不会调用FilterChain了 来看下SecurityContextLogoutHandler的logout方法,如下List -4所示, List-4 public void logout(HttpServletRequest request, HttpServletResponse response, Authentication SecurityContextHolder.getContext(); context.setAuthentication(null); } SecurityContextHolder.clearContext(); } 在List
IgnoreExceptionHandler只是将异常打印下,但是FatalExceptionHandler则不同,正如其名字所示,它内部将异常再次封装到RuntimeException再次抛出,如下List -4 List-4 public final class FatalExceptionHandler implements ExceptionHandler<Object> { private
com.mjduan.project.springbootlearn.selector.SelectorB"}; } } 之后定义自己的EnableMyX,如下List-3 List-3 import java.lang.annotation.Documented ; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy ; import java.lang.annotation.Target; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME Import({MyImportSelector.class}) public @interface EnableMyX { } 在main方法的类上加上注解EnableMyX,如下所示: List