多线程死锁的问题有谁遇见过?

解决方案 »

  1.   


    Java 多线程 之 银行ATM实例 http://www.verejava.com/?id=16992914422268
      

  2.   

    org.springframework.dao.CannotAcquireLockException: 
    ### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
    ### The error may involve defaultParameterMap
    ### The error occurred while setting parameters
    ### SQL: delete from mjsxd_payment_repday_detailed where ba_id=? and from_Datas = '2'
    ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
    ; SQL []; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
            at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:259) ~[spring-jdbc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) ~[mybatis-spring-1.3.1.jar:1.3.1]
            at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446) ~[mybatis-spring-1.3.1.jar:1.3.1]
            at com.sun.proxy.$Proxy68.delete(Unknown Source) ~[na:na]
            at org.mybatis.spring.SqlSessionTemplate.delete(SqlSessionTemplate.java:310) ~[mybatis-spring-1.3.1.jar:1.3.1]
            at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:67) ~[mybatis-3.4.4.jar:3.4.4]
            at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59) ~[mybatis-3.4.4.jar:3.4.4]
            at com.sun.proxy.$Proxy108.deleteByBachId(Unknown Source) ~[na:na]
            at com.mjs.bigdata.antifraud.service.MjsxdPaymentRepdayDetailedServiceImpl.deleteByBachId(MjsxdPaymentRepdayDetailedServiceImpl.java:95) ~[rc-servant-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
            at com.mjs.bigdata.antifraud.service.MjsxdPaymentRepdayDetailedServiceImpl$$FastClassBySpringCGLIB$$9e1cb3f4.invoke(<generated>) ~[rc-servant-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
            at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) ~[spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at com.mjs.bigdata.antifraud.tool.ExecutionChainAspect.processServiceMethod(ExecutionChainAspect.java:132) ~[classes/:0.0.1-SNAPSHOT]
            at sun.reflect.GeneratedMethodAccessor216.invoke(Unknown Source) ~[na:na]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
            at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
            at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) [spring-aop-4.3.9.RELEASE.jar:4.3.9.RELEASE]
            at com.mjs.bigdata.antifraud.service.MjsxdPaymentRepdayDetailedServiceImpl$$EnhancerBySpringCGLIB$$c697f796.deleteByBachId(<generated>) [rc-servant-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
            at com.mjs.bigdata.antifraud.controller.taskJob.DZjob.checkAction(DZjob.java:102) [classes/:0.0.1-SNAPSHOT]
            at com.mjs.bigdata.antifraud.controller.taskJob.DZjob.run(DZjob.java:479) [classes/:0.0.1-SNAPSHOT]
            at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_91]
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_91]
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_91]
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_91]
            at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:951) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197) ~[mysql-connector-java-5.1.42.jar:5.1.42]
            at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:493) ~[druid-1.1.0.jar:1.1.0]
            at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:46) ~[mybatis-3.4.4.jar:3.4.4]
            at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74) ~[mybatis-3.4.4.jar:3.4.4]
            at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.4.4.jar:3.4.4]
            at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.4.4.jar:3.4.4]
            at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.4.4.jar:3.4.4]
            at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198) ~[mybatis-3.4.4.jar:3.4.4]
            at org.apache.ibatis.session.defaults.DefaultSqlSession.delete(DefaultSqlSession.java:213) ~[mybatis-3.4.4.jar:3.4.4]
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
            at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
            at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433) ~[mybatis-spring-1.3.1.jar:1.3.1]
            ... 26 common frames omittedException in thread "Thread-12" java.lang.StringIndexOutOfBoundsException: String index out of range: 200
            at java.lang.String.substring(String.java:1963)
            at com.mjs.bigdata.antifraud.controller.taskJob.DZjob.checkAction(DZjob.java:218)
            at com.mjs.bigdata.antifraud.controller.taskJob.DZjob.run(DZjob.java:479)
            at java.lang.Thread.run(Thread.java:745)
      

  3.   

    给你个最容易死锁的类,CountDownLatch,这个类是用来解决线程多并发的(新手了解死锁最直观的类)。
    CountDownLatch cdl=new CountDownLatch(2);//创建实例时定义锁的次数
    cdl.await();//让当前线程等待
    cdl.countDown();//每次减少锁的次数
    只有当你锁的次数减到0的的之后,之前设置等待的线程才会获得执行的机会。你可以最直观的了解到死锁。
    死锁的定义就是:两个或者两个以上的线程都相互等待,一直得不到执行的机会!
      

  4.   

    我是刚刚入门的,我都没听过你们说的是啥呢.hahah