王文伟
王文伟
``` #!/bin/bash if [ $# -eq 0 ];then echo "please enter java pid" exit -1 fi pid=$1 jstack_cmd="" if [[ $JAVA_HOME != "" ]]; then jstack_cmd="$JAVA_HOME/bin/jstack" else r=`which jstack 2>/dev/null`...
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) - corePoolSize: 线程池维护线程的最少数量 - maximumPoolSize:线程池维护线程的最大数量 - keepAliveTime: 线程池维护线程所允许的空闲时间 - unit: 线程池维护线程所允许的空闲时间的单位 - workQueue: 线程池所使用的缓冲队列 - handler:...
catalina.sh 里面 CATALINA_OPTS后面加上,address=20051 或者 ``` JPDA_TRANSPORT=dt_socket JPDA_ADDRESS=20051 JPAD_SUSPEND=n ``` 或者 ``` JPDA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=20051’ ```  如果是springboot ``` ... ... ... org.springframework.boot spring-boot-maven-plugin 1.1.12.RELEASE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 ... ... ... ... ``` mvn...
mock代码如下 ``` public static void main(String[] args) { for(int i=0;ihash_to_index(hashValue); oop found_string = the_table()->lookup(index, name, len, hashValue); // Found if (found_string != NULL) { ensure_string_alive(found_string); return found_string; } debug_only(StableMemoryChecker smc(name,...
new Thread()不会启动一个新线程,而是调用init的这个方法设置一些东西,比如设置线程组,栈大小,拿到线程名,tid。创建一个ThreadLocalMap。 而start方法才会启动一个线程。 其实start方法的核心就是调用了 ``` private native void start0(); ``` start0 -> JVM_StartThread 虾面是openjdk 的jvm源码http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/75d40493551f/src/share/vm/prims/jvm.cpp ``` JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread)) JVMWrapper("JVM_StartThread"); JavaThread *native_thread = NULL; // We cannot hold...
##方案一:数据库乐观锁 乐观锁通常实现基于数据版本(version)的记录机制实现的,比如有一张红包表(t_bonus),有一个字段(left_count)记录礼物的剩余个数,用户每领取一个奖品,对应的left_count减1,在并发的情况下如何要保证left_count不为负数,乐观锁的实现方式为在红包表上添加一个版本号字段(version),默认为0。 ####异常实现流程 ``` -- 可能会发生的异常情况 -- 线程1查询,当前left_count为1,则有记录 select * from t_bonus where id = 10001 and left_count > 0 -- 线程2查询,当前left_count为1,也有记录 select * from t_bonus where id = 10001...
我们知道有很多业务场景下,大量繁琐的次流程需要处理,比如更新索引等操作。但是这样一来业务主流程和次流程揉在一起显得就没那么干净。如果一些比较重的东西可能使用mq来做比较好,但是我这里就讲一下比较轻量级的做法。利用guava event来处理一些次流程。 首先我们先看下guava event的最小demo ```java final EventBus eventBus = new EventBus(); eventBus.register(new Object(){ @Subscribe public void lister(Integer integer) { System.out.printf("%s from int%n", integer); } }); eventBus.post(1); ``` 我们一个个来看,EventBus其实是运用了观察者模式,我们往他注册一个事件订阅者,只要事件被投递,投入的类型相匹配就会被订阅者处理。如果是异步的事件 ```java ExecutorService...
http://microservices.io/patterns/cn/index.html
# 多线程和并发 ## Runnable/Callable Runnable接口只有一个没有返回值的方法。 ``` trait Runnable { def run(): Unit } ``` Callable与之类似,除了它有一个返回值 ``` trait Callable[V] { def call(): V } ``` ## 线程 Scala并发是建立在Java并发模型基础上的。 在Sun JVM上,对IO密集的任务,我们可以在一台机器运行成千上万个线程。 一个线程需要一个Runnable。你必须调用线程的...
``` public class ClassA { public void method1(){ System.out.println("hello method1"); } public static void main(String[] args){ ClassB classB = new ClassB(); classB.callback("method1"); } } ``` ``` public class ClassB {...