java泛型

java 泛型 ​很多朋友对java的泛型不是很理解,很多文章写的已不是很清楚,这篇博客对java泛型进行 一个总结。 1.泛型的转换 List foo1 = new ArrayList();//illegal 很多朋友会写出上面的代码,但会报如下错误:Type mismatch: cannot convert from ArrayList to List 尽管Interge是Number的子类,但是ArrayList不是List的子类,所以报错。下图可以很好解释这个问题。 2.java泛型的通配符? 这里可以分为两类(1)? extends T (2) ? super T. 很多朋友对这两个不是很理解,也不知道上面时候用,我们知道java中提供泛型技术,是为了提供安全检查的,使得我们写的代码更加的健壮。 2.1 ? extends T public static void print_e(List<? extends Number> list){ for(Number n : list){ System.out.println(n); } } 上面一个函数,我们可以传递如下的参数 List<Integer> list_i = new ArrayList<Integer>(); for(int i=0;i<10;i++){ list_i.add(i); } List<Double> list_d = new ArrayList<Double>(); for(int i=0;i<10;i++){ list_d.add(i+0.0); } print_e(list_i); print_e(list_d); 使得我们写的代码即具有通用型有可以提供必要的安全检查,当然print_e你可以写出如下形式,这里就不具有安全检查的效果了。 void print_e(List list) 但是经常有的朋友写出如下的代码,我们举一个stackoverflow上的一个例子:...

3 分钟 · pan

linux shell 变量$含义

$开头的变量 测试代码,sh文件名:params.sh #!/bin/bash # $$ Shell本身的PID(ProcessID) printf "The complete list is %s\n" "$$" # $! Shell最后运行的后台Process的PID printf "The complete list is %s\n" "$!" # $? 最后运行的命令的结束代码(返回值) printf "The complete list is %s\n" "$?" # $* 所有参数列表 printf "The complete list is %s\n" "$*" # $@ 所有参数列表 printf "The complete list is %s\n" "$@" # $# 添加到Shell的参数个数 printf "The complete list is %s\n" "$#" # $0 Shell本身的文件名 printf "The complete list is %s\n" "$0" # $1 第一个参数 printf "The complete list is %s\n" "$1" # $2 第二个参数 printf "The complete list is %s\n" "$2 执行命令...

1 分钟 · pan

mysql 杂七杂八记录

mysql 命令 加共享锁 select * from table where ? lock in share mode; 排它锁 select * from table where ? for update; 查询当前运行的所有事务 select * from information_schema.innodb_trx\G 显示用户正在运行的线程 show processlist\G 查看是否开启自动提交 show variables like 'autocommit'; 打开或关闭自动提交 set autocommit = 1;//打开 set autocommit = 0;//关闭 查看数据库隔离级别 select @@tx_isolation;//当前会话隔离级别 select @@global.tx_isolation;//系统隔离级别 设置数据库隔离级别(当前会话) SET session transaction isolation level read uncommitted; SET session transaction isolation level read committed; SET session transaction isolation level REPEATABLE READ; SET session transaction isolation level Serializable; 查询bin_log 是否开启 show variables like 'log_bin';

1 分钟 · pan

mysql事务隔离级别的实现原理

mysql事务隔离级别的实现原理 mysql innodb中的四种事务隔离级别上文主要以实验的形式的展示了四种隔离级别产生的读一致性问题,本文主要讨论一下mysql是如何实现这四种隔离级别的。 一、什么是事务的隔离级别 在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。具备ACID的特性。ACID分别指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、永久性(Durability)。 事务隔离(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。针对这种不一致的级别,产生了事务隔离的四个类别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。 可重复读(Repeated Read)是mysql的默认级别,本文以它为分析重点。 二、再看可重复读 可重复读:举例来说就是在一个事务内,如果先后发生了两次查询$Q_1, Q_2$,如果$Q_2$看到的内容只包含$Q_1$的内容和自已在本次事务中的内容,看不到其他事务操作的结果(无论其他事务对$Q_1$内容更新还是删除),那么这个就叫可重复读。 这里需要再次强调不可重复读和幻读的区别,不可重复读是针对删除和更新的,幻读是针对插入的。看起来幻读是属于不可以重复读的范畴的,但是为什么要分开呢? 个人觉得是因为解决这两个的方式是不同的,对于不可重复读,可以直接用普通的锁来解决。但是对于幻读,由于不可能锁住不存在的记录,所以这里就分开了,对于幻读其实是用的Next_Key锁(行锁+Gap锁)来解决的,这个上一篇文章有提到。 三 实验一(读-写操作) 关闭自动提交、设置隔离级别为可重复读 开始时刻,会话A,B查询到的结果如下: mysql> select * from test; +----+---------+ | id | account | +----+---------+ | 1 | 400 | | 2 | 500 | | 3 | 600 | +----+---------+ 3 rows in set (0.00 sec) 会话B插入一条记录并提交 mysql> select * from test; +----+---------+ | id | account | +----+---------+ | 1 | 400 | | 2 | 500 | | 3 | 600 | +----+---------+ 3 rows in set (0....

3 分钟 · pan

nvidia smi docker usage

正文 docker 和 nvidia-docker命令的区别 如果容器中需要用到cuda,但是使用docker 启动是找不到cuda的,nvidia-smi命令也无法使用。必须使用nvidia-docker启动。经试验,如下命令也是ok的,docker指定参数 –gpus docker run --rm --gpus all nvidia/cuda nvidia-smi 指定使用那一块GPU 使用全部的gpu docker run --rm --gpus all nvidia/cuda nvidia-smi 使用环境变量NVIDIA_VISIBLE_DEVICES来指定使用那一个GPU(必须指定runtime,–runtime=nvidia) docker run --rm --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all nvidia/cuda nvidia-smi 容器内可以使用两块gpu docker run --rm --gpus 2 nvidia/cuda nvidia-smi 指定gpu编号 docker run --gpus '"device=1,2"' nvidia/cuda nvidia-smi --query-gpu=uuid --format-csv [参考文档] https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/user-guide.html nvidia-docker2 安装

1 分钟 · pan