• 关于

    park

    的搜索结果

问题

在特定字符串之后如何捕获任何字符串

我正在尝试捕获后面的所有字符in,at直到该行的末尾。 如何捕获它们,并且不包括在内? Johen在公园里玩。 返回in the park它应该the park: text.m...
养狐狸的猫 2019-12-01 20:00:33 5 浏览量 回答数 0

回答

GetConnectionTimeoutException的Cause就是这个 请问一下,这个问题已经解决了吗? 我也查看了一下代码,发现如果创建数据库连接失败的话,通过Druid获取连接的方法会一直阻塞: 这是我用jstack看到的: <preclass="brush:java;toolbar:true;auto-links:false;">"AWT-EventQueue-0"prio=6tid=0x05068c00nid=0x151cwaitingoncondition[0x056ae000]java.lang.Thread.State:WAITING(parking)atsun.misc.Unsafe.park(NativeMethod)-parkingtowaitfor<0x2a48e958>(ajava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)atjava.util.concurrent.locks.LockSupport.park(LockSupport.java:186)atjava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)atcom.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:1376)atcom.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1051)atcom.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:916)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:896)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:886)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:96)atorg.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) <divclass='ref'> 引用来自“losthu1998”的评论 请问一下,这个问题已经解决了吗? 我也查看了一下代码,发现如果创建数据库连接失败的话,通过Druid获取连接的方法会一直阻塞: 这是我用jstack看到的: <preclass="brush:java;toolbar:true;auto-links:false;">"AWT-EventQueue-0"prio=6tid=0x05068c00nid=0x151cwaitingoncondition[0x056ae000]java.lang.Thread.State:WAITING(parking)atsun.misc.Unsafe.park(NativeMethod)-parkingtowaitfor<0x2a48e958>(ajava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)atjava.util.concurrent.locks.LockSupport.park(LockSupport.java:186)atjava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)atcom.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:1376)atcom.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1051)atcom.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:916)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:896)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:886)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:96)atorg.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 谢谢,我也没什么好办法,只能换成DBCP如果数据库down掉,一般给客户端返回什么?SQLException之类的吧,你可以使用dbcp,tomcat-jdbc测试下,都可以返回异常 我也遇到这个问题,楼主咋搞定的尝试了几种方案都没能解决,加之我们当时对sql监控的需求不大,后来就放弃druid改用tomcat-jdbc了。 看这篇博客: <arel="nofollow">https://www.cnblogs.com/xchendevelop/articles/9291044.html
爱吃鱼的程序员 2020-06-14 16:56:49 0 浏览量 回答数 0

问题

请教停靠问题

有几个域名在万网,一直闲置中,最近闲来无事,请教下域名的停靠。 首先是 万网在sedo。com的名字是什么,找了半天没有找到 国内有好的park平台吗 ? 求推荐...
searchina 2019-12-01 21:38:08 4605 浏览量 回答数 4

回答

java中Hashcode生成依赖于底层的JVM。可以使用-XX:hashCode=n指定算法。其中5算法,部分使用了线程相关的随机算法。0 – Park-Miller RNG (default)1 – f(address, global_statement)2 – constant 13 – Serial counter4 – Object address5 – Thread-local Xorshift理论上我们可以重写Hashcode,我猜测是可以使用随机算法。
徐雷frank 2019-12-02 01:48:58 0 浏览量 回答数 0

回答

如果在yarn群集上运行作业,则可以运行以下命令: spark-submit --master yarn --jars --conf --name 例如: spark-submit --master yarn --jars example.jar --conf spark.executor.instances=10 --name example_job example.py arg1 arg2因为mnistOnSpark.py你应该传递上面命令中提到的参数。 spark submit认为你正试图通过--cluster_mode s park 工作。
社区小助手 2019-12-02 01:46:28 0 浏览量 回答数 0

回答

park-mllib包含依赖spark-graphx。您应该在pom.xml中将其排除: org.apache.sparkspark-mllib_${scala.binary.version}${spark.version} <exclusion> <groupId>org.apache.spark</groupId> <artifactId>spark-graphx_${scala.binary.version}</artifactId> </exclusion>
社区小助手 2019-12-02 01:46:18 0 浏览量 回答数 0

问题

jfinal 重定向外部链接报错?报错

微信公众号做一个 下载APP 的按钮,在后台判断用户是安卓还是苹果,如果是安卓,就重定向到http://XXXX.XX.49.8/download/cloudpark_v1.0.3.apk 让用户去...
爱吃鱼的程序员 2020-06-09 15:29:43 42 浏览量 回答数 1

问题

Graphframes / Graphx连接组件跳过数字

我正在使用Spark Graphframes库来创建身份解析系统。我已经能够使用spark找到匹配。我的计划是使用图表查找人与人之间的瞬时链接,并为他们分配一个id进行进一步分析等。我使用了以下数据(来自公共febrl数据库):顶点数据样本...
社区小助手 2019-12-01 19:28:45 519 浏览量 回答数 1

回答

一.Lock接口(java.util.concurrent.locks): void lock():获取锁,阻塞方式;如果资源已被其他线程锁定,那么lock将会阻塞直到获取锁,锁阻塞期间不受线程的Interrupt的影响,在获取锁成功后,才会检测线程的interrupt状态,如果interrupt=true,则抛出异常。 unlock():释放锁 tryLock():尝试获取锁,并发环境中"闯入"行为,如果有锁可用,直接获取锁并返回true,否则范围false. lockInterruptibly():尝试获取锁,并支持"中断"请求。与lock的区别时,此方法的开始、结束和执行过程中,都会不断检测线程的interrupt状态,如果线程被中断,则立即抛出异常;而不像lock方法那样只会在获取锁之后才检测。 二.Lock接口实现类 Lock直接实现,只有3个类:ReentrantLock和WriteLock/ReadLock;这三种锁;Lock和java的synchronized(内置锁)的功能一致,均为排他锁. ReentrantLock为重入排他锁,对于同一线程,如果它已经持有了锁,那么将不会再次获取锁,而直接可以使用. ReentrantReadWriteLock并没有继承ReentrantLock,而是一个基于Lock接口的单独实现.它实现了 ReadWriteLock,即读写分离锁,是一种采用锁分离技巧的API. 尽管在API级别ReentrantReadWriteLock和ReentrantLock没有直接继承关系,但是ReentrantReadWriteLock中的ReadLock和WriteLock都具有ReentrantLock的全部语义(简单说,就是把ReentrantLock的代码copy了一下.),即锁的可重入性.WriteLock支持Condition(条件),ReadLock不支持. Lock的实现类中,都包含了2中锁等待策略:公平和非公平;其实他们的实现也非常简单,底层都是使用了queue来维持锁请求顺序.[参考:http://shift-alt-ctrl.iteye.com/blog/1839142] 公平锁,就是任何锁请求,首先将请求加入队列,然后再有队列机制来决定,是阻塞还是分配锁. 非公平,就是允许"闯入",当然公平锁,也无法干扰"闯入",对于任何锁请求,首先检测锁状态是否可用,如果可用直接获取,否则加入队列.. ReentrantLock本质上和synchronized修饰词是同一语义,如果一个线程lock()之后,其他线程进行lock时必须阻塞,直到当前线程的前续线程unlock.[执行lock操作时,将会被队列化(假如在公平模式下),获取lock的线程都将具有前续/后继线程,前续线程就是当前线程之前执行lock操作而阻塞的线程,后继线程就是当前线程之后执行lock操作的线程;那么对于unlock操作就是"解锁"信号的传递,如果当前线程unlock,那么将会触发后继线程被"唤醒",即它因为lock操作阻塞状态被解除.];这是ReentrantLock的基本原理,但是当ReentrantLock在Conditon情况下,事情就变得更加复杂.[参加下述] 三.Condition:锁条件 Condition与Lock形成happen-before关系。Condition将Object的监视器方法(wait,notify,notifyAll)分解成截然不同的对象,以便通过这些对象与任意Lock实现组合。使Lock具有等待“集合”的特性,或者“类型”;Lock替代了synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。(synchronized + object.wait对应Lock + Condition.await) Condition又称条件队列,为线程提供了一个含义,以便在某种状态条件现在可能为true的其他线程通知它之前,一直挂起该线程。即多个线程,其中一个线程因为某个条件而阻塞,其他线程当“条件”满足时,则“通知”哪些阻塞的线程。这,几乎和object中wait和notify的机制一样。 Condition和wait一样,阻塞时也将原子性的释放锁(间接执行了release()方法)。并挂起线程。Condition必须与Lock形成关系,只有获取lock权限的,才能进行Condition操作。Condition底层基于AQS实现,条件阻塞,将以队列的方式,LockSupport支持。其实现类有ConditionObject,这也是Lock.newCondition()的返回实际类型,在等待 Condition 时,允许发生“虚假唤醒”,这通常作为对基础平台语义的让步。对于大多数应用程序,这带来的实际影响很小,因为 Condition 应该总是在一个循环中被等待,并测试正被等待的状态声明。某个实现可以随意移除可能的虚假唤醒,但建议应用程序程序员总是假定这些虚假唤醒可能发生,因此总是在一个循环中等待。 void await() throws InterruptedException:当前线程阻塞,并原子性释放对象锁。如下条件将触发线程唤醒: 当线程被中断(支持中断响应), 其他线程通过condition.signal()方法,且碰巧选中当前线程唤醒 其他线程通过condition.signalAll()方法 发生虚假唤醒 底层实现,await()方法将当前线程信息添加到Conditon内部维护的"await"线程队列的尾部(此队列的目的就是为singal方法保持亟待唤醒的线程的顺序),然后释放锁(执行tryRelease()方法,注意此处释放锁,仅仅是释放了锁信号,并不是unlock,此时其他线程仍不能获取锁--lock方法阻塞),然后使用LockSupport.park(this)来强制剥夺当前线程执行权限。await方法会校验线程的中断标记。 由此可见,await()方法执行之后,因为已经"归还"了锁信号,那么其他线程此时执行lock方法,将不再阻塞.. void awaitUninterruptibly():阻塞,直到被唤醒。此方法不响应线程中断请求。即当线程被中断时,它将继续等待,直到接收到signal信号(你应该能想到"陷阱"),当最终从此方法返回时,仍然将设置其中断状态。 void signal()/signalAll():唤醒一个/全部await的线程。 对于signal()方法而言,底层实现为,遍历await"线程队列,找出此condition上最先阻塞的线程,并将此阻塞线程unpark.至此为止,我们似乎发现"锁信号"丢失了,因为在线程await时通过tryRelease时释放了一次信号.那么被signal成功的线程,首先执行一次acquire(增加锁信号),然后校验自己是否被interrupted,如果锁信号获取成功且线程状态正常,此时才正常的从await()方法退出.经过这么复杂的分析,终于明白了ReentrantLock + Condition情况下,锁状态变更和线程控制的来龙去脉... Java代码 收藏代码 //////例子: private Lock lock = new ReentrantLock(); private Condition full = lock.newCondition(); private Condition empty = lock.newCondition(); public Object take(){ lock.lock(); try{ while(isEmpty()){ empty.await() } Object o = get() full.signalAll(); return o; }finally{ lock.unlock(); } } public void put(Object o){ lock.lock(); try{ while(isFull()){ full.await(); } put(o); empty.signalAll(); }finally{ lock.unlock(); } } 四.机制 Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。注意,Lock 实例只是普通的对象,其本身可以在 synchronized 语句中作为目标使用。获取 Lock 实例的监视器锁与调用该实例的任何 lock() 方法没有特别的关系。为了避免混淆,建议除了在其自身的实现中之外,决不要以这种方式使用 Lock 实例。 Lock接口具有的方法: void lock():获取锁,阻塞直到获取。 void lockInterruptibly() throws InterrutedException:获取锁,阻塞直到获取成功,支持中断响应。 boolean tryLock():尝试获取锁,返回是否获取的结果。如果碰巧获取成功,则返回true,此时已经持有锁。 boolean tryLock(long time,TimeUnit) throws InterruptedException:尝试获取锁,获取成功返回true,超时时且没有获取锁则返回false。 void unlock():释放锁。约定只有持有锁者才能释放锁,否则抛出异常。 void newCondition():返回绑定到lock的条件。 五.ReadWriteLock ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer(写锁),读取锁可以由多个 reader 线程同时保持(共享锁)。写入锁是独占的。所有 ReadWriteLock 实现都必须保证 writeLock 操作的内存同步效果也要保持与相关 readLock 的联系。也就是说,成功获取读锁的线程会看到写入锁之前版本所做的所有更新。 与互斥锁相比,读-写锁允许对共享数据进行更高级别的并发访问。虽然一次只有一个线程(writer 线程)可以修改共享数据,但在许多情况下,任何数量的线程可以同时读取共享数据(reader 线程),读-写锁利用了这一点。从理论上讲,与互斥锁相比,使用读-写锁所允许的并发性增强将带来更大的性能提高。在实践中,只有在多处理器上并且只在访问模式适用于共享数据时,才能完全实现并发性增强。 Lock readLock():返回读锁。 Lock writeLock():返回写锁。 六.ReentrantLock ReentrantLock,重入排它锁,它和synchronized具有相同的语义以及在监视器上具有相同的行为,但是功能更加强大。 ReetrantLock将由最近成功获得锁且还没有释放锁的线程标记为“锁占有者”;当锁没有被线程持有时,调用lock方法将会成功获取锁并返回,如果当前线程为锁持有者,再次调用lock将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。 ReentrantLock的构造方法,允许接收一个“公平策略”参数,“公平策略”下,多个线程竞争获取锁时,将会以队列化锁请求者,并将锁授予队列的head。在“非公平策略”下,则不完全保证锁获取的顺序,允许闯入行为(tryLock)。 ReentrantLock基于AQS机制,锁信号量为1,如果信号量为1且当前锁持有者不为自己,则不能获取锁。释放锁时,如果当前锁持有者不是自己,也将抛出“IllegalMonitorStateException”。由此可见,对于ReentrantLock,lock和release方法是需要组合出现。 七.ReentrantReadWriteLock:可重入读写分离锁 重入性 :当前线程可以重新获取相应的“读锁”或者“写锁”,在写入线程保持的所有写入锁都已经释放后,才允许重入reader(读取线程)使用它们。writer线程可以获取读锁,但是reader线程却不能直接获取写锁。 锁降级:重入还允许写入锁降级为读锁,其实现方式为:先获取写入锁,然后获取读取锁,最后释放写入锁。但是读取锁不能升级为写入锁。 Conditon的支持:只有写入锁支持conditon,对于读取锁,newConditon方法直接抛出UnsupportedOperationException。 ReentrantReadWriteLock目前在java api中无直接使用。ReentrantReadWriteLock并没有继承自 ReentrantLock,而是单独重新实现。其内部仍然支持“公平性”“非公平性”策略。 ReentrantReadWriteLock基于AQS,但是AQS只有一个state来表示锁的状态,所以如果一个state表示2种类型的锁状态,它做了一个很简单的策略,“位运算”,将一个int类型的state拆分为2个16位段,左端表示readlock锁引用计数,右端16位表示write锁。在readLock、writeLock进行获取锁或者释放锁时,均是通过有效的位运算和位控制,来达到预期的效果。 八.ReadLock void lock():获取读取锁,伪代码如下: Java代码 收藏代码 //如果当前已经有“写锁”,且持有写锁者不是当前线程(如果是当前线程,则支持写锁,降级为读锁),则获取锁失败 //即任何读锁的获取,必须等待队列中的写锁释放 //c为实际锁引用量(exclusiveCount方法实现为:c & ((1<<16) -1) if (exclusiveCount(c) != 0 &&getExclusiveOwnerThread() != current) return -1; //CAS操作,操作state的左端16位。 if(CAS(c,c + (1<<16))){ return 1; } void unlock():释放read锁,即共享锁,伪代码如下: Java代码 收藏代码 //CAS锁引用 for (;;) { int c = getState(); int nextc = c - (1<<16);//位操作,释放一个锁。 if (compareAndSetState(c, nextc)) return nextc == 0; } 九.WriteLock void lock():获取写入锁,伪代码如下: Java代码 收藏代码 //当前线程 Thread current = Thread.currentThread(); //实际的锁引用state int c = getState(); //右端16位,通过位运算获取“写入锁”的state int w = exclusiveCount(c); //如果有锁引用 if (c != 0) { //且所引用不是自己 if (w == 0 || current != getExclusiveOwnerThread()){ return false; } } //如果写入锁state为0,且CAS成功,则设置state和独占线程信息 if ((w == 0 && writerShouldBlock(current)) ||!compareAndSetState(c, c + acquires)){ return false; } setExclusiveOwnerThread(current); return true; void unlock():释放写入锁,伪代码如下: Java代码 收藏代码 //计算释放锁的信号量 int nextc = getState() - releases; //对于写入锁,则校验当前线程是否为锁持有者,否则不可以释放(死锁) if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); //释放锁,且重置独占线程信息 if (exclusiveCount(nextc) == 0) { setExclusiveOwnerThread(null); setState(nextc); return true; } else { setState(nextc); return false; } 十.LockSupport:用来创建锁和其他同步类的基本线程阻塞原语。 底层基于hotspot的实现unsafe。park 和 unpark 方法提供了阻塞和解除阻塞线程的有效方法。三种形式的 park(即park,parkNanos(Object blocker,long nanos),parkUntil(Object blocker,long timestamp)) 还各自支持一个 blocker 对象参数。此对象在线程受阻塞时被记录,以允许监视工具和诊断工具确定线程受阻塞的原因。(这样的工具可以使用方法 getBlocker(java.lang.Thread) 访问 blocker。)建议最好使用这些形式,而不是不带此参数的原始形式。 在锁实现中提供的作为 blocker 的普通参数是 this。 static void park(Object blocker):阻塞当前线程,直到如下情况发生: 其他线程,调用unpark方法,并将此线程作为目标而唤醒 其他线程中断当前线程此方法不报告,此线程是何种原因被放回,需要调用者重新检测,而且此方法也经常在while循环中执行 Java代码 收藏代码 while(//condition,such as:queue.isEmpty){ LockSupport.park(queue);//此时queue对象作为“阻塞”点传入,以便其他监控工具查看,queue的状态 //检测当前线程是否已经中断。 if(Thread.interrupted()){ break; } } void getBlocker(Thread t):返回提供最近一次尚未解除阻塞的park的阻塞点。可以返回null。 void unpark(Thread t):解除指定线程阻塞,使其可用。参数null则无效果。 LockSupport实例(不过不建议在实际代码中直接使用LockSupport,很多时候,你可以使用锁来控制): Java代码 收藏代码 /////////////Demo public class LockSupportTestMain { /** * @param args */ public static void main(String[] args) throws Exception{ System.out.println("Hear!"); BlockerObject blocker = new BlockerObject(); LThread tp = new LThread(blocker, false); LThread tt = new LThread(blocker, true); tp.start(); tt.start(); Thread.sleep(1000); } static class LThread extends Thread{ private BlockerObject blocker; boolean take; LThread(BlockerObject blocker,boolean take){ this.blocker = blocker; this.take = take; } @Override public void run(){ if(take){ while(true){ Object o = blocker.take(); if(o != null){ System.out.println(o.toString()); } } }else{ Object o = new Object(); System.out.println("put,,," + o.toString()); blocker.put(o); } } } static class BlockerObject{ Queue<Object> inner = new LinkedList<Object>(); Queue<Thread> twaiters = new LinkedList<Thread>(); Queue<Thread> pwaiters = new LinkedList<Thread>(); public void put(Object o){ inner.offer(o); pwaiters.offer(Thread.currentThread()); Thread t = twaiters.poll(); if(t != null){ LockSupport.unpark(t); } System.out.println("park"); LockSupport.park(Thread.currentThread()); System.out.println("park is over"); } public Object take(){ Thread t = pwaiters.poll(); if(t != null){ System.out.println("unpark"); LockSupport.unpark(t); System.out.println("unpark is OK"); } //twaiters.offer(Thread.currentThread()); return inner.poll(); } } } 备注:有时候会疑惑wait()/notify() 和Unsafe.park()/unpark()有什么区别?区别是wait和notify是Object类的方法,它们首选需要获得“对象锁”,并在synchronized同步快中执行。park和unpark怎不需要这么做。wait和park都是有当前线程发起,notify和unpark都是其他线程发起。wait针对的是对象锁,park针对的线程本身,但是最终的效果都是导致当前线程阻塞。Unsafe不建议开发者直接使用。
景凌凯 2020-04-24 16:41:16 0 浏览量 回答数 0

回答

synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:  ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁  ReentrantLock可以获取各种锁的信息  ReentrantLock可以灵活地实现多路通知    另外,二者的锁机制其实也是不一样的:ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word。
问问小秘 2020-01-03 14:06:07 0 浏览量 回答数 0

回答

顾名思义,轻量级锁是相对于重量级锁而言的。使用轻量级锁时,不需要申请互斥量,仅仅将Mark Word中的部分字节CAS更新指向线程栈中的Lock Record,如果更新成功,则轻量级锁获取成功,记录锁状态为轻量级锁;自旋是java重量级锁的一种状态(当多次自旋之后,切换到内核态park)。这边问题1有些奇怪。 当发生竞争的时候轻量级锁会变成重量级锁。 这边原来是偏向锁的话,碰到有其他线程访问,会变成轻量级锁(注意这里并没有发生竞争)。 这个必然是非own 线程的另一个线程修改偏向锁。问题2 : 请注意对象并非是栈区分配的,是堆区的,对于堆区是每个线程值都是一样的(不考虑短时间内的不可见性)。场景2: 重量级锁,对象头其实就没啥用了,指向的是底层的独享。实际就是cpp 的mutex。
游客gqfovp2pbgogc 2019-12-02 01:58:26 0 浏览量 回答数 0

问题

1分钟,摆脱后端API

mds 开发原因: 对于前后端分离,大家肯定遇到过,当后端 API 没有编写完成时,前端无法进行调试,这就导致了前端会被后端阻塞的情况。而mds相当...
芳草香的绿 2019-12-01 21:41:39 2276 浏览量 回答数 1

回答

单说状态直接看 API 就好了 https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.htmlNEW : 线程创建之后,但是还没有启动。RUNNABLE : 正在 Java 虚拟机下跑任务的线程的状态。BLOCKED: 阻塞状态,等待锁的释放,比如线程A进入了一个 synchronized 方法,线程B也想进入这个方法,但是这个方法的锁已经被线程A获取了,这个时候线程B就处于 BLOCKED 状态WAITING: 等待状态,处于等待状态的线程是由于执行了 3 个方法中的任意方法。1. Object的wait方法,并且没有使用timeout参数; 2. Thread的join方法,没有使用timeout参数 3. LockSupport的park方法。 处于 waiting 状态的线程会等待另外一个线程处理特殊的行为。 再举个例子,如果一个线程调用了一个对象的wait方法,那么这个线程就会处于waiting状态直到另外一个线程调用这个对象的notify或者notifyAll方法后才会解除这个状态。TIMED_WAITING: 有等待时间的等待状态,比如调用了以下几个方法中的任意方法,并且指定了等待时间,线程就会处于这个状态。1. Thread.sleep方法 2. Object的wait方法,带有时间 3. Thread.join方法,带有时间 4. LockSupport的 parkNanos 方法,带有时间 5. LockSupport的 parkUntil 方法,带有时间 TERMINATED: 线程中止的状态,这个线程已经完整地执行了它的任务
倚贤 2019-12-02 01:39:42 0 浏览量 回答数 0

问题

用<a>方式提交ajax请求无效:报错

@张慧华 你好,想跟你请教个问题: 我在表格中使用<a title="您确定要删除么?" target="ajaxTodo" href=...
kun坤 2020-06-14 14:54:02 0 浏览量 回答数 1

问题

用<a>方式提交ajax请求无效:配置报错 

@张慧华 你好,想跟你请教个问题: 我在表格中使用<a title="您确定要删除么?" target="ajaxTodo" href=...
kun坤 2020-06-02 14:33:35 0 浏览量 回答数 1

问题

Ant-Design Table 嵌入下拉框,可整行删除

需求如下图。antD 提供带输入框的,每一个单元格都用如何做 代码如下: import { Table, Input, Button, Popconfirm, Form } from 'antd&#...
问问小秘 2020-01-09 15:59:25 4 浏览量 回答数 1

回答

" <a href=""http://my.oschina.net/dwz"" class=""referer"" target=""_blank"">@张慧华 你好,想跟你请教个问题: 我在表格中使用<a title="您确定要删除么?" target="ajaxTodo" href="@Url.Action("Delete")/@park.Id" class="btnDel">删除</a>  形式进行数据删除处理,相应的提示框弹出都没有问题,就是点击对话框的“确定”按钮以后,提示框被关闭了,但是ajax请求并没有触发,服务端没有收到任何请求。我把title部分删除就可以提交了。 我看了一下代码,在alertMsg的_open中,有以下内容 if (buttons[i].call) jCallButs.eq(i).click(buttons[i].call); 这里好像是把事先定义的okCall事件绑给alertMsg的“确定”按钮的click事件吧? 但是最终“确定”按钮的click只执行了alertMsg的close事件。 不知道我理解的是否正确,希望得到您的指导,谢谢! "
montos 2020-05-31 22:45:06 0 浏览量 回答数 0

问题

使用gcore生成的Java核心文件有用吗?

我们有一个JAVA应用程序通过消耗一些(未知的)资源来阻止其他组件创建新线程,从而使我们的redhat服务器(30核/ 512Go ram)崩溃了,我们目前...
祖安文状元 2020-01-08 15:41:02 3 浏览量 回答数 1

问题

用<a>方式提交ajax请求无效-服务报错

" <a href=""http://my.oschina.net/dwz"" class=""referer"" target=...
montos 2020-05-31 22:44:57 0 浏览量 回答数 1

问题

用<a>方式提交ajax请求无效 - ajax报错

" <a href=""http://my.oschina.net/dwz"" class=""referer"" target=...
montos 2020-06-03 17:10:01 2 浏览量 回答数 1

问题

Java-SDK的常见问题(三)

调用OSS Java SDK夯住 调用OSS Java SDK夯住(hang),通过jstack -l <pid>查看堆栈,夯在如下的位置: "main" pri...
青衫无名 2019-12-01 21:40:53 1299 浏览量 回答数 0

问题

使用@Async异步任务提交事物不生效?报错

@Override @Async("asyncInvoiceExecutor") public void printInvoiceByType(List<InvoiceLog> i...
爱吃鱼的程序员 2020-06-08 11:01:13 0 浏览量 回答数 0

问题

spring+activeMQ关闭tomcat服务器报错

&lt;property name="brokerURL" value="${activeMQ.connection.brokerURL}" /&gt; &lt;property name="userName" value="${a...
你啊你abc 2019-12-01 20:00:58 2009 浏览量 回答数 1

问题

在myeclipse启动正常,部署到服务器报错。?报错

18-Jun-2015 02:13:49.180 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReference...
爱吃鱼的程序员 2020-06-14 15:23:25 0 浏览量 回答数 1

回答

@oscfox错误日志得贴出来吧INFO:Projectrootconfigurationfile:NONE INFO:SonarQubeScanner2.6.1 INFO:Java1.8.0_91OracleCorporation(32-bit) INFO:Windows76.1x86 INFO:Usercache:C:\Users\Administrator\.sonar\cache ERROR:SonarQubeserver[http://localhost:9000]cannotbereached INFO:------------------------------------------------------------------------ INFO:EXECUTIONFAILURE INFO:------------------------------------------------------------------------ INFO:Totaltime:5.414s INFO:FinalMemory:2M/15M INFO:------------------------------------------------------------------------ ERROR:ErrorduringSonarQubeScannerexecution ERROR:UnabletoexecuteSonarQube ERROR:Causedby:Failtodownloadlibrariesfromserver ERROR:Causedby:Connectionrefused:connect ERROR: ERROR:Toseethefullstacktraceoftheerrors,re-runSonarQubeScannerwith the-eswitch. ERROR:Re-runSonarQubeScannerusingthe-Xswitchtoenablefulldebuglogging。 @Yashin大神看看这个错误提示 Re-runSonarQubeScannerusingthe-Xswitchtoenablefulldebuglogging。看看详细日志啊,看起来是无法从sonarwebserver下载插件,也看看webserver的日志Sonar/log/sonar.log2016.05.2509:36:04ERRORweb[o.a.c.c.C.[.[.[/]]Exceptionsendingcontextinitializedeventtolistenerinstanceofclassorg.sonar.server.platform.RubyRailsContextListener org.jruby.rack.RackInitializationException:ActiveRecord::JDBCError:Tablespacefortable'`sonar`.`schema_migrations`'exists.PleaseDISCARDthetablespacebeforeIMPORT.:CREATETABLE`schema_migrations`(`version`varchar(255)NOTNULL)ENGINE=InnoDBCHARACTERSETutf8COLLATEutf8_bin    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract_adapter.rb:227:in`log'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/adapter.rb:183:in`execute'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract/schema_statements.rb:109:in`create_table'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/mysql/adapter.rb:252:in`create_table'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract/schema_statements.rb:371:in`initialize_schema_migrations_table'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/migration.rb:441:in`initialize'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/migration.rb:401:in`up'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/migration.rb:383:in`migrate'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/config/../lib/database_version.rb:66:in`upgrade_and_start'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/config/../lib/database_version.rb:77:in`automatic_setup'    fromE:/Sonra/sonarqube-5.5/web/WEB-INF/config/environment.rb:306:in`(root)'    fromorg/jruby/RubyKernel.java:1094:in`load'    fromfile:/E:/Sonra/sonarqube-5.5/lib/server/jruby-rack-1.1.13.2.jar!/jruby/rack/rails/environment2.rb:1:in`(root)'    fromfile:/E:/Sonra/sonarqube-5.5/lib/server/jruby-rack-1.1.13.2.jar!/jruby/rack/rails/environment2.rb:25:in`load_environment'    fromfile:/E:/Sonra/sonarqube-5.5/lib/server/jruby-rack-1.1.13.2.jar!/jruby/rack/rails_booter.rb:79:in`load_environment'    atorg.jruby.rack.RackInitializationException.wrap(RackInitializationException.java:29)~[jruby-rack-1.1.13.2.jar:na]    atorg.jruby.rack.RackApplicationFactoryDecorator.init(RackApplicationFactoryDecorator.java:98)~[jruby-rack-1.1.13.2.jar:na]    atorg.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:50)~[jruby-rack-1.1.13.2.jar:na]    atorg.sonar.server.platform.RubyRailsContextListener.contextInitialized(RubyRailsContextListener.java:38)~[sonar-server-5.5.jar:na]    atorg.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4812)[tomcat-embed-core-8.0.30.jar:8.0.30]    atorg.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255)[tomcat-embed-core-8.0.30.jar:8.0.30]    atorg.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)[tomcat-embed-core-8.0.30.jar:8.0.30]    atorg.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)[tomcat-embed-core-8.0.30.jar:8.0.30]    atorg.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)[tomcat-embed-core-8.0.30.jar:8.0.30]    atjava.util.concurrent.FutureTask.run(UnknownSource)[na:1.8.0_91]    atjava.util.concurrent.ThreadPoolExecutor.runWorker(UnknownSource)[na:1.8.0_91]    atjava.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)[na:1.8.0_91]    atjava.lang.Thread.run(UnknownSource)[na:1.8.0_91] Causedby:org.jruby.exceptions.RaiseException:(StatementInvalid)ActiveRecord::JDBCError:Tablespacefortable'`sonar`.`schema_migrations`'exists.PleaseDISCARDthetablespacebeforeIMPORT.:CREATETABLE`schema_migrations`(`version`varchar(255)NOTNULL)ENGINE=InnoDBCHARACTERSETutf8COLLATEutf8_bin    atRUBY.log(E:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract_adapter.rb:227)~[na:na]    atRUBY.execute(E:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/adapter.rb:183)~[na:na]    atRUBY.create_table(E:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract/schema_statements.rb:109)~[na:na]    atRUBY.create_table(E:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/mysql/adapter.rb:252)~[na:na]    atRUBY.initialize_schema_migrations_table(E:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/connection_adapters/abstract/schema_statements.rb:371)~[na:na]    atRUBY.initialize(E:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/migration.rb:441)~[na:na]    atRUBY.up(E:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/migration.rb:401)~[na:na]    atRUBY.migrate(E:/Sonra/sonarqube-5.5/web/WEB-INF/gems/gems/activerecord-2.3.15/lib/active_record/migration.rb:383)~[na:na]    atRUBY.upgrade_and_start(E:/Sonra/sonarqube-5.5/web/WEB-INF/config/../lib/database_version.rb:66)~[na:na]    atRUBY.automatic_setup(E:/Sonra/sonarqube-5.5/web/WEB-INF/config/../lib/database_version.rb:77)~[na:na]    atRUBY.(root)(E:/Sonra/sonarqube-5.5/web/WEB-INF/config/environment.rb:306)~[na:na]    atorg.jruby.RubyKernel.load(org/jruby/RubyKernel.java:1094)~[jruby-complete-1.7.9.jar:na]    atRUBY.(root)(file:/E:/Sonra/sonarqube-5.5/lib/server/jruby-rack-1.1.13.2.jar!/jruby/rack/rails/environment2.rb:1)~[na:na]    atRUBY.load_environment(file:/E:/Sonra/sonarqube-5.5/lib/server/jruby-rack-1.1.13.2.jar!/jruby/rack/rails/environment2.rb:25)~[na:na]    atRUBY.load_environment(file:/E:/Sonra/sonarqube-5.5/lib/server/jruby-rack-1.1.13.2.jar!/jruby/rack/rails_booter.rb:79)~[na:na] 2016.05.2509:36:04ERRORweb[o.a.c.c.StandardContext]Oneormorelistenersfailedtostart.Fulldetailswillbefoundintheappropriatecontainerlogfile 2016.05.2509:36:04ERRORweb[o.a.c.c.StandardContext]Context[]startupfailedduetopreviouserrors 2016.05.2509:36:04WARN web[o.a.c.l.WebappClassLoaderBase]Thewebapplication[ROOT]appearstohavestartedathreadnamed[Abandonedconnectioncleanupthread]buthasfailedtostopit.Thisisverylikelytocreateamemoryleak.Stacktraceofthread:  java.lang.Object.wait(NativeMethod)  java.lang.ref.ReferenceQueue.remove(UnknownSource)  com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:43) 2016.05.2509:36:04WARN web[o.a.c.l.WebappClassLoaderBase]Thewebapplication[ROOT]appearstohavestartedathreadnamed[JRubyJIT-1]buthasfailedtostopit.Thisisverylikelytocreateamemoryleak.Stacktraceofthread:  sun.misc.Unsafe.park(NativeMethod)  java.util.concurrent.locks.LockSupport.park(UnknownSource)  java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(UnknownSource)  java.util.concurrent.LinkedBlockingQueue.take(UnknownSource)  java.util.concurrent.ThreadPoolExecutor.getTask(UnknownSource)  java.util.concurrent.ThreadPoolExecutor.runWorker(UnknownSource)  java.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)  java.lang.Thread.run(UnknownSource) 2016.05.2509:36:04WARN web[o.a.c.l.WebappClassLoaderBase]Thewebapplication[ROOT]appearstohavestartedathreadnamed[JRubyJIT-2]buthasfailedtostopit.Thisisverylikelytocreateamemoryleak.Stacktraceofthread:  sun.misc.Unsafe.park(NativeMethod)  java.util.concurrent.locks.LockSupport.park(UnknownSource)  java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(UnknownSource)  java.util.concurrent.LinkedBlockingQueue.take(UnknownSource)  java.util.concurrent.ThreadPoolExecutor.getTask(UnknownSource)  java.util.concurrent.ThreadPoolExecutor.runWorker(UnknownSource)  java.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)  java.lang.Thread.run(UnknownSource) 2016.05.2509:36:04INFO web[o.a.c.h.Http11NioProtocol]StartingProtocolHandler["http-nio-0.0.0.0-9000"] 2016.05.2509:36:05INFO web[o.s.s.a.TomcatAccessLog]Webserverisstarted 2016.05.2509:36:05INFO web[o.s.s.a.EmbeddedTomcat]HTTPconnectorenabledonport9000 2016.05.2509:36:05WARN web[o.s.p.ProcessEntryPoint]Failtostartweb java.lang.IllegalStateException:Webappdidnotstart    atorg.sonar.server.app.EmbeddedTomcat.isUp(EmbeddedTomcat.java:84)~[sonar-server-5.5.jar:na]    atorg.sonar.server.app.WebServer.isUp(WebServer.java:48)[sonar-server-5.5.jar:na]    atorg.sonar.process.ProcessEntryPoint.launch(ProcessEntryPoint.java:105)~[sonar-process-5.5.jar:na]    atorg.sonar.server.app.WebServer.main(WebServer.java:69)[sonar-server-5.5.jar:na] 2016.05.2509:36:05INFO web[o.a.c.h.Http11NioProtocol]PausingProtocolHandler["http-nio-0.0.0.0-9000"] 2016.05.2509:36:06INFO web[o.a.c.h.Http11NioProtocol]StoppingProtocolHandler["http-nio-0.0.0.0-9000"] 2016.05.2509:36:06INFO web[o.a.c.h.Http11NioProtocol]DestroyingProtocolHandler["http-nio-0.0.0.0-9000"] 2016.05.2509:36:06INFO web[o.s.s.a.TomcatAccessLog]Webserverisstopped JavaHotSpot(TM)ClientVMwarning:ignoringoptionMaxPermSize=160m;supportwasremovedin8.0 2016.05.2509:36:06INFO app[o.s.p.m.Monitor]Process[es]isstopping 2016.05.2509:36:06INFO  es[o.s.p.StopWatcher] Stoppingprocess 2016.05.2509:36:06INFO  es[o.elasticsearch.node] [sonar-1464140116077]stopping... 2016.05.2509:36:06INFO  es[o.elasticsearch.node] [sonar-1464140116077]stopped 2016.05.2509:36:06INFO  es[o.elasticsearch.node] [sonar-1464140116077]closing... 2016.05.2509:36:06INFO  es[o.elasticsearch.node] [sonar-1464140116077]closed 2016.05.2509:36:07INFO app[o.s.p.m.Monitor]Process[es]isstopped <--WrapperStopped @Yashin大神为什么会报这个错误呢?刚开始的时候只是建个数据库而已里面根本就没有表的 sonarstop然后把数据库清空了,再sonarstar。出现这个的原因可能是你首次启动sonarweb的时候启动失败,但却把数据库表建起来了。 @Yashin大神runner运行需要配上项目? ERROR:ErrorduringSonarrunnerexecutionERROR:UnabletoexecuteSonarERROR:Causedby:Youmustdefinethefollowingmandatorypropertiesfor'Unknown':sonar.projectKey,sonar.projectName,sonar.projectVersion,sonar.sourcesERROR:ERROR:Toseethefullstacktraceoftheerrors,re-runSonarQubeRunnerwiththe-eswitch.ERROR:Re-runSonarQubeRunnerusingthe-Xswitchtoenablefulldebuglogging.@Yashin报错信息 @Yashin已经在项目里配置了运行还是报错上面那个错 SonarQubeRunner2.4Java1.8.0_141OracleCorporation(64-bit)Linux3.10.0-693.2.2.el7.x86_64amd64INFO:Errorstacktracesareturnedon.INFO:Runnerconfigurationfile:/usr/local/sonar-runner-2.4/conf/sonar-runner.propertiesINFO:Projectconfigurationfile:NONEINFO:Defaultlocale:"en_US",sourcecodeencoding:"UTF-8"INFO:Workdirectory:/usr/local/sonar-runner-2.4/bin/./.sonarINFO:------------------------------------------------------------------------INFO:EXECUTIONFAILUREINFO:------------------------------------------------------------------------Totaltime:30.167sFinalMemory:1M/29MINFO:------------------------------------------------------------------------ERROR:ErrorduringSonarrunnerexecutionorg.sonar.runner.kevinsawicki.HttpRequest$HttpRequestException:java.net.SocketTimeoutException:connecttimedout   atorg.sonar.runner.kevinsawicki.HttpRequest.code(HttpRequest.java:1392)   atorg.sonar.runner.kevinsawicki.HttpRequest.ok(HttpRequest.java:1417)   atorg.sonar.runner.impl.ServerConnection.downloadString(ServerConnection.java:93)   atorg.sonar.runner.impl.ServerVersion.downloadVersion(ServerVersion.java:47)   atorg.sonar.runner.impl.ServerVersion.version(ServerVersion.java:38)   atorg.sonar.runner.impl.ServerVersion.is37Compatible(ServerVersion.java:58)   atorg.sonar.runner.impl.JarDownloader.checkVersionAndDownload(JarDownloader.java:36)   atorg.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:71)   atjava.security.AccessController.doPrivileged(NativeMethod)   atorg.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)   atorg.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)   atorg.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)   atorg.sonar.runner.api.Runner.execute(Runner.java:100)   atorg.sonar.runner.Main.executeTask(Main.java:70)   atorg.sonar.runner.Main.execute(Main.java:59)   atorg.sonar.runner.Main.main(Main.java:53)Causedby:java.net.SocketTimeoutException:connecttimedout   atsun.reflect.NativeConstructorAccessorImpl.newInstance0(NativeMethod)   atsun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)   atsun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)   atjava.lang.reflect.Constructor.newInstance(Constructor.java:423)   atsun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1926)   atsun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1921)   atjava.security.AccessController.doPrivileged(NativeMethod)   atsun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1920)   atsun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1490)   atsun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)   atjava.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)   atorg.sonar.runner.kevinsawicki.HttpRequest.code(HttpRequest.java:1390)   ...15moreCausedby:java.net.SocketTimeoutException:connecttimedout   atjava.net.PlainSocketImpl.socketConnect(NativeMethod)   atjava.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)   atjava.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)   atjava.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)   atjava.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)   atjava.net.Socket.connect(Socket.java:589)   atsun.net.NetworkClient.doConnect(NetworkClient.java:175)   atsun.net.www.http.HttpClient.openServer(HttpClient.java:463)   atsun.net.www.http.HttpClient.openServer(HttpClient.java:558)   atsun.net.www.http.HttpClient.<init>(HttpClient.java:242)   atsun.net.www.http.HttpClient.New(HttpClient.java:339)   atsun.net.www.http.HttpClient.New(HttpClient.java:357)   atsun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1202)   atsun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1138)   atsun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1032)   atsun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:966)   atsun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1546)   atsun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)   atsun.net.www.protocol.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:2982)   atorg.sonar.runner.kevinsawicki.HttpRequest.header(HttpRequest.java:1903)   atorg.sonar.runner.kevinsawicki.HttpRequest.contentType(HttpRequest.java:2308)   atorg.sonar.runner.impl.ServerConnection.downloadString(ServerConnection.java:89)   ...13more 
爱吃鱼的程序员 2020-06-09 14:24:21 0 浏览量 回答数 0

回答

" 1.首先,明确两个问题,synchronized 一般不是跟AtomicXX类进行比较,更多的是跟ReentrantLock这个类进行比较,网上关于这2者的比较很多,可以自行google之。 2.问题中关于无锁跟有锁的疑问,测试代码b中的代码是有问题的, 对于方法a,synchronized代码块来说,锁被第一个进来的线程持有后,后续线程请求获取锁会被阻塞挂起,直到前面一个线程释放锁,后续的线程会恢复执行,由于锁的存在,20个请求类似于顺序执行,这一层由jvm调度对于方法b,cas操作是非阻塞的,方法中的while循环其实是一直在执行(不断尝试进行cas操作),而我们知道,死循环是会消耗cpu资源的,并发数越多,线程越多,此处的cas操作越多,必然导致cpu使用率飙升,方法b中的代码由jmeter测试的时候理论上来说应该一直由20个活跃的工作线程存在,cpu与线程模型是另外一个话题,线程数的调优是jvm一个比较高级的话题,感兴趣可以自行google之说说ReentrantLock与synchronized:通常情况下在高并发下,ReentrantLock比synchronized拥有更好的性能,而且ReentrantLock提供来一些synchronized并不提供的功能(锁超时自动放弃等),示例代码中可以减少sleep的时间,从而模拟更短停顿,更高的并发,500ms对于人来说很短,对于cpu来说基本就是天文数字了,基本用“慢如蜗牛”来形容也不为过,修改类一下示例代码: package com.gzs.learn.springboot; import java.util.LinkedList; import java.util.Random; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.LockSupport; import java.util.concurrent.locks.ReentrantLock; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/bench/") public class BenchController { private Random random = new Random(); private static Object[] lockObj; private static AtomicReference<Integer>[] locks; private static ReentrantLock[] reentrantLocks; static { lockObj = new Object[100]; for (int i = 0; i < lockObj.length; i++) { lockObj[i] = new Object(); } locks = new AtomicReference[100]; for (int i = 0; i < locks.length; i++) { locks[i] = new AtomicReference<Integer>(null); } reentrantLocks = new ReentrantLock[100]; for (int i = 0; i < reentrantLocks.length; i++) { reentrantLocks[i] = new ReentrantLock(); } } @RequestMapping("a/{id}") @ResponseBody public long a(@PathVariable("id") int id) throws Exception { long start = System.currentTimeMillis(); int index = id % 100; long inner = 0; synchronized (lockObj[index]) { inner = test(); } long result = System.currentTimeMillis() - start; System.out.println("all: " + result + " inner: " + inner); return result; } @RequestMapping("b/{id}") @ResponseBody public long b(@PathVariable("id") int id) throws Exception { long start = System.currentTimeMillis(); id = id % 100; AtomicReference<Integer> lock = locks[id]; int b = 0; while (!lock.compareAndSet(null, id)) { b = 1 + 1; } long inner = test(); boolean flag = lock.compareAndSet(id, null); long result = System.currentTimeMillis() - start; System.out.println("all: " + result + " inner: " + inner + " flag:" + flag); System.out.println(b); return result; } @RequestMapping("c/{id}") @ResponseBody public long c(@PathVariable("id") int id) throws Exception { long start = System.currentTimeMillis(); id = id % 100; ReentrantLock lock = reentrantLocks[id]; lock.lock(); long inner = test(); lock.unlock(); long result = System.currentTimeMillis() - start; System.out.println("all: " + result + " inner: " + inner); return result; } public long test() throws Exception { long innerstart = System.currentTimeMillis(); Thread.sleep(0, 100); // Thread.sleep(500); System.out.println(System.currentTimeMillis() - innerstart); return System.currentTimeMillis() - innerstart; } } 方法c是用ReentrantLock实现的,绝大多少情况下ReentrantLock比synchronized高效juc(java.util.concurrent)中的核心类Aqs(AbstractQueuedSynchronizer)是一个基于队列的 并发包,默认线程在锁竞争(自旋)超过1000纳秒的时候会被park(挂起操作),从而减少cpu频繁的线程切换,可以尝试调整方法c中的sleep的时间参数。测试方法,本机没有装jmeter,用apache ab做的测试,测试命令: ab -n 100 -c 20 http://localhost:8080/bench/a/10"
因为相信,所以看见。 2020-05-27 17:33:13 0 浏览量 回答数 0

问题

[Top 12 Signs You're Dealing With Trolls]:报错

这个写喷子的文章有意思。看来喷子也是普世价值的一部份嘛。[Top 12 Signs You're Dealing With Trolls]:报错 Top 12 Signs You're Dealing...
kun坤 2020-06-09 23:09:43 0 浏览量 回答数 1

问题

ignite从2.6.0升级到2.7.5有报错?报错

@李玉珏 你好,想跟你请教个问题:      之前我用的ignite2.6.0版本,用静态路由方式集群,服务内嵌到tomcat中启动没有问题,现在升级为2.7....
爱吃鱼的程序员 2020-06-05 15:43:59 0 浏览量 回答数 1

问题

spring-boot-starter-actuator集成问题?报错

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: "${sprin...
爱吃鱼的程序员 2020-06-08 11:10:46 0 浏览量 回答数 0

问题

启动tomcat时报错,在线等大神指点迷津?报错

在线等大神 一月 05, 2017 11:46:26 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetPropertiesRule]{Serve...
爱吃鱼的程序员 2020-06-08 19:22:02 0 浏览量 回答数 1

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT