try

如何避免死锁

冷暖自知 提交于 2020-02-07 04:22:46
死锁发生的条件 互斥,共享资源只能被一个线程占用 占有且等待,线程 t1 已经取得共享资源 s1,尝试获取共享资源 s2 的时候,不释放共享资源 s1 不可抢占,其他线程不能强行抢占线程 t1 占有的资源 s1 循环等待,线程 t1 等待线程 t2 占有的资源,线程 t2 等待线程 t1 占有的资源 避免死锁的方法 对于以上 4 个条件,只要破坏其中一个条件,就可以避免死锁的发生。 对于第一个条件 "互斥" 是不能破坏的,因为加锁就是为了保证互斥。 其他三个条件,我们可以尝试 一次性申请所有的资源,破坏 "占有且等待" 条件 占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它占有的资源,破坏 "不可抢占" 条件 按序申请资源,破坏 "循环等待" 条件 使用管理类一次性申请所有的资源,破坏 "占有且等待" 条件示例 package constxiong.concurrency.a023; import java.util.HashSet; import java.util.Set; /** * 测试 一次性申请所有的资源,破坏 "占有且等待" 条件示例 * @author ConstXiong * @date 2019-09-24 14:04:12 */ public class TestBreakLockAndWait { //单例的资源管理类 private

netty权威指南学习笔记一——NIO入门(4)AIO

本秂侑毒 提交于 2020-02-07 03:50:16
  NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供以下两种方式获取操作结果。   1、通过java.util.concurrent.Future 类来表示异步操作的结果;   2、在执行异步操作的时候传入一个java.io.channels。   ComplementHandler接口的实现类作为操作完成的回调。   NIO2.0的异步套接字通道是真正的异步非阻塞I/O, 它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写 ,从而简化了NIO编程模型。   改造后的代码 server端代码:    1 package com.example.biodemo; 2 3 4 import java.io.*; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 public class TimeServer { 9 public static void main(String[] args) throws IOException { 10 int port = 8092; 11 if (args != null && args.length > 0) { 12 try { 13 port = Integer.valueOf(args[0

Java第十九章-数据库操作

不羁岁月 提交于 2020-02-07 03:12:46
绪论 //数据库系统是由数据库、数据库管理系统、应用系统、数据库管理员构成的。 连接数据库 //通过创建的getConnection()方法,获取与MySQL数据库的连接。 package 数据库操作; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; public class Conn { //声明Connection对象 Connection conn; public Connection getConnection() { //加载数据库驱动类 try { Class.forName("com.myaql.jbdc.Driver"); System.out.println("数据库加载成功"); } catch (ClassNotFoundException e) { e.printStackTrace(); } //通过访问数据库的URL,获取数据库连接对象 try { conn = DriverManager.getConnection("jdbc.mysql:" + "//127.0.0.1:3306/test","root", "123456"); System.out.println(

xingtai -猜拳和try一try

非 Y 不嫁゛ 提交于 2020-02-07 01:08:20
import random win = 0 lose = 0 draw = 0 xia = 0 for a in range ( 10 ) : print ( "这是第" + str ( a + 1 ) + "局" ) computer = random . randint ( 1 , 3 ) we = input ( "你在武汉出什么????" ) try : we = int ( we ) jieguo = computer - we if we > 3 or we < 1 : print ( "瞎出会得肺炎" ) xia = xia + 1 else : if jieguo == - 1 or jieguo == 2 : print ( "赢:武汉必胜" ) win = win + 1 elif jieguo == - 2 or jieguo == 1 : print ( "输:捐点物资吧!!!" ) lose = lose + 1 elif jieguo == 0 : print ( "平:加油,武汉!!" ) draw = draw + 1 # print(computer) if computer == 1 : print ( "电脑出的是石头" ) elif computer == 2 : print ( "电脑出的是布" ) elif computer == 3 :

对数据库进行增删查改的通用操作

南楼画角 提交于 2020-02-07 00:17:46
//增删改的通用操作 public void update ( String sql , Object . . . args ) { //1.获取连接 Connection conn = null ; PreparedStatement ps = null ; try { conn = JDBCUtils . getConnection ( ) ; //2.获得prepareStatement实例 ps = conn . prepareStatement ( sql ) ; //3.赋值 for ( int i = 0 ; i < args . length ; i ++ ) { ps . setObject ( i + 1 , args [ i ] ) ; } //4.执行 ps . execute ( ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } finally { //5.关流 if ( ps != null ) { try { ps . close ( ) ; } catch ( SQLException e ) { e . printStackTrace ( ) ; } } if ( conn != null ) { try { conn . close ( ) ; } catch (

机器学习(Machine Learning)- 吴恩达(Andrew Ng) 学习笔记(十)

久未见 提交于 2020-02-06 23:45:46
Advice for applying machine learning Decide what to try next Debugging a learning algorithm 调试学习算法 Suppose you have implemented regularized linear regression to predict housing prices. \[ J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda\sum_{j=1}^m\theta_j^2 \right] \] However, when you test your hypothesis on a new set of houses, you find that it makes unacceptably large errors in its predictions. What should you try next? 假如你已经完成了房价预测的正则化线性回归(也就是最小化代价函数 \(J\) 的值),然而在你测试新的样例时发现产生了巨大的误差。要想改进这个算法你该怎么办? 可选的方法: Get more training examples 用更多的训练样本(收集样本耗费太大精力)

记一下修改实例注解属性的代码

你说的曾经没有我的故事 提交于 2020-02-06 11:36:09
//obj 对象 className 字段上的注解类 private void changeAnnotation(Class<?> obj,String fieldName, Class className, String changename,String fname){ try { Field field= obj.getDeclaredField(fieldName); Annotation aClass= field.getAnnotation(className); InvocationHandler invocationHandler = Proxy.getInvocationHandler(aClass); Field annoField = invocationHandler.getClass().getDeclaredField("memberValues"); annoField.setAccessible(true); try { Map memberValues = (Map) annoField.get(invocationHandler); //修改注解属性 memberValues.put(fname,changename); } catch (IllegalAccessException e) { e.printStackTrace(); } }

深入了解 Java 中的异常处理 + 面试题

ぐ巨炮叔叔 提交于 2020-02-06 10:00:25
深入了解 Java 中的异常处理 在程序开发中,异常处理也是我们经常使用到的模块,只是平常很少去深究异常模块的一些知识点。比如,try-catch 处理要遵循的原则是什么,finally 为什么总是能执行,try-catch 为什么比较消耗程序的执行性能等问题,我们本讲内容都会给出相应的答案,当然还有面试中经常被问到的异常模块的一些面试题,也是我们本篇要讲解的重点内容。 异常处理基础介绍 先来看看 异常处理的语法格式 : try{ … } catch(Exception e){ … } finally{ … } 其中, try :是用来监测可能会出现异常的代码段。 catch :是用来捕获 try 代码块中某些代码引发的异常,如果 try 里面没有异常发生,那么 catch 也一定不会执行。在 Java 语言中,try 后面可以有多个 catch 代码块,用来捕获不同类型的异常,需要注意的是前面的 catch 捕获异常类型一定不能包含后面的异常类型,这样的话,编译器会报错。 finally :不论 try-catch 如何执行,finally 一定是最后执行的代码块,所有通常用来处理一些资源的释放,比如关闭数据库连接、关闭打开的系统资源等。 异常处理的基本使用 ,具体可以参考下面的代码段: try { int i = 10 / 0; } catch

解决springboot+mybatis自定义异常使用@Transactional无法回滚问题

Deadly 提交于 2020-02-06 06:03:34
网上的解决方法 都是复制来复制去的 导致有部分人因为 某些问题 还是无法解决这个问题 网上解决方法: 1.Exception改为RuntimeException 2.@Transactional(rollbackFor = Exception.class) 3.手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() //我还是会报错,懒得深究 某些问题: 旧代码并没有throw s RuntimeException 直接try catch一个throw new RuntimeException 而修改完的代码是添加了throw s RuntimException 不用try catch,直接throw new RuntimeException 原因: 在spring机制中,在配置事务后,如果采用try catch 捕获异常后, 因为异常已经被捕获 , 所以事务不会滚 ,从而产生许多脏数据。 来源: CSDN 作者: LicoLeung 链接: https://blog.csdn.net/qq_42390424/article/details/104186171

自己手动复现一个熊猫烧香病毒

限于喜欢 提交于 2020-02-06 05:27:54
自己手动复现一个熊猫烧香病毒 起因 最近逛了一下 bilibili ,偶然的一次机会,我在 bilibili 上看到了某个 up 主分享了一个他自己仿照熊猫病毒的原型制作的一个病毒的演示视频,虽然这个病毒的出现距离现在已经十多年之久了,但是它的威胁性仍然不亚于永恒之蓝,出现了很多变种病毒。我觉得蛮有意思的,有必要深究一下,所以我花上几天的时间研究了一下熊猫烧香病毒的源码,仿照熊猫烧香病毒原型,也制作了一个类似的软件,实现的源码我会在文章的末尾给出 GitHub 项目链接,喜欢的朋友不要忘记给我一个 star and follow 呀! 熊猫烧香的介绍 熊猫烧香是一个感染性的蠕虫病毒,它能感染系统中的 exe , com , pif , src , html , asp 等文件,它还能中止大量的反病毒软件进程并且会删除扩展名为 gho 的文件,该文件是一系统备份工具 GHOST 的备份文件,使用户的系统备份文件丢失。被感染的用户系统中所有的.exe可执行文件图标全部被改成熊猫烧香的图标,如下图所示: 如果有同学对熊猫烧香的来源感兴趣的话,可以看看中科大写的关于熊猫烧香的案件分析: 由“熊猫烧香”谈起 病毒结构分析 从上述的流程图中我们可以看到,含有病毒体的文件被运行后,病毒将自身拷贝至系统目录,同时修改注册表,将自身设置为开机启动项,并遍历各个驱动器,将自身写入磁盘根目录,增加一个