NIO
内容来自:java nio线程精讲
NIO简介NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件读写操作
IO和NIO的区别
IO
NIO
面向流
面向缓冲区
阻塞IO
非阻塞IO
无
选择器
NIO的核心在于:通道(channel)和缓冲区(buffer)。通道表示打开到IO设备的连接。如需要使用NIO系统,需要获取用于IO设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。
缓冲区1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161 ...
Future和Callable
Runnable的缺陷
不能返回一个返回值
不能抛出checked Exception
因为run使用void修饰的也不能抛出异常
Callable接口
类似于Runnable,被其他线程执行的任务
实现call方法(类似于实现run方法)
是有返回值的也可以抛出异常
Future类
作用:一个方法可能会很耗时,就可以用一个子线程来执行这个耗时的方法,就不用一直等,直到想要获取结果时就可以通过Future来控制
Future和Callable的关系:
可以通过Future的get方法获取Callable的执行结果
可以通过Future的isDown判断任务是否执行完毕
还有取消等方法
在call()未执行完毕之前,调用get()的线程就会被阻塞,直到call()方法返回了结果,线程才能获取结果并且切换到runnable状态
Future是一个存储器,它存储了call()任务的结果,但是这个任务的执行时间是无法提前确定的,所以这取决于call()方法执行的情况
Future的主要方法
get():get方法的行为取决于Callable任务的状态
任务正常完成:get方法会 ...
Sting的坑
比较地址12345678910111213141516171819202122232425262728293031String a = "123";String b = "123";//trueSystem.out.println(a == b);String c = new String("123");//falseSystem.out.println(a == c);String d = a;//trueSystem.out.println(d == b);String e = "1" + "23";//trueSystem.out.println(a == e);String _1 = "1";String _23 = "23";String f = _1 + _23;//falseSystem.out.println(a == f);String g = "1" + _23;//falseSystem.out.print ...
不变性
什么是不变性
如果对象被创建后,状态就不能被修改,那么它就是不可变的
具有不变性的对象一定是线程安全的,我们不需要对其采取任何例外的安全措施
final
类防止被继承、方法防止被重写、变量防止被修改
天生线程安全且不需要额外同步开销
三种用法
修饰变量
被修饰的变量意味着值不能被修改,如果变量是个对象,则只是引用不能变,但是内容可以变
属性被声明为final后,该变量则只能被赋值一次而且必须赋值,且一旦被赋值后,final的变量就不能被再改变
类中的final属性
第一种实在声明变量的等号右边直接赋值
第二种就是构造函数中赋值
第三种是在类的初始化代码块中赋值(不常用)
类中的static final属性
两个赋值时机:除了在声明变量等号右边直接赋值外,还可以使用static初始代码块赋值,但不能使用普通的初始代码块
方法中的final变量
由于变量在方法里,所以没有构造函数也不存在初始代码块
不要求赋值时期,但是使用前必须要赋值,和非final的变量要求一样
修饰方法
不允许修饰构造方法
修饰的方法不能被重写但是可以重载
修饰类
不可被继承
不变 ...
CAS
CAS概念
运用在并发场合下,实现不能被打断的数据交换操作
我认为V值应该是X,如果是的话就修改成Y,如果不是就说明被别人修改过,那我就不修改了,避免多人同时修改导致出错,最后返回V的值
模拟CAS代码案例
1234567891011121314151617181920212223242526272829public class SimulatedCAS implements Runnable{ private volatile int value; public synchronized int compareAndSwap(int expectedValue, int newValue) { int oldValue = value; if (oldValue == expectedValue) { value = newValue; } return oldValue; } public static void main(S ...
java原子类
什么是原子类
不可分割
一个操作是不可中断的,即便是多线程的情况下也是可以保证的
java.util.concurrent.atomic包下
原子类的作用和锁类似,是为了保证并发情况下线程安全,原子类相比于锁,有一定的优势
粒度更细:原子变量可以把竞争范围缩小到变量级别,这是我们可以获得最细粒度的情况了
性能更高:通常情况下使用原子类的效率比使用锁的效率更高,除了高度竞争的情况
Atomic*基本原子类AtomicInteger为例
public final int get():获取当前值
public final int getAndSet(int newValue):获取当前值然后设置新值
public final int getAndIncrement():获取当前值然后自增
public final int getAndDecrement():获取当前值然后自减
public final int getAndAdd(int delta):获取当前值然后加上参数中的值
public final int compareAndSet(int expect,int update): ...
java锁
为什么需要Lock?为什么synchronized不够用
效率低:锁的释放情况少、试图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程
不够灵活:加锁和释放的时机单一,每个锁仅有单一的条件
无法知道是否成功获取锁
死锁的情况1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253public class Test { static Resource resource1 = new Resource(); static Resource resource2 = new Resource(); public static void main(String[] args) { new Thread(new task(true)).start(); new Thread(new task(false)).start(); }}class Resource& ...
ThreadLocal
使用场景
每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)
如果每个线程new一个工具类的话浪费资源
如果使用静态变量可能会导致线程安全问题
如果使用加锁等方式会影响性能
ThreadLocal泛型中传入需要的工具类类型然后重写initialValue()方法
每个线程内需要保存全局变量(例如拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递麻烦
强调的是同一个请求内(同一个线程内)不同方法间的共享
不需要重写initialValue()方法,但必须手动调用set()方法
ThreadLocal的两个作用
让某个需要用的对象在线程间隔离(每个线程都有自己的独立对象)
在任何方法中都可以轻松获取该对象
ThreadLocal的4点好处
达到线程安全
不需要加锁,提高执行效率
更高效地利用内存、节省开销:本来是一个任务新建一个工具类,使用ThreadLocal后每个线程新建一个工具类就行
免去传参的繁琐,同时也使代码耦合度更低
Thread、ThreadLocal、ThreadLocalMap三者关系
...
Activity7基础
内容来自:
Activiti7工作流引擎视频教程
Activiti的基本用法pom文件123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <slf4j.version>1.6.6 ...
MySQL存储过程和函数
存储过程和函数概述事先经过编译并存储在数据库中的一段SQL语句集合,可以简化开发人员的工作,减少数据在数据库和应用服务之间的传输
函数:有返回值的过程;
过程:没有返回值的过程;
创建存储过程1234CREATE PROCEDURE pre_test()BEGIN SELECT * from city;end
调用1call `过程名`
查询存储过程1SELECT name from mysql.proc where db="数据库名"
删除存储过程1DROP PROCEDURE `过程名`
变量123456789101112131415161718192021-- 声明变量CREATE PROCEDURE pro_test() BEGIN DECLARE `变量名` `变量类型` DEFAULT `默认类型`; SELECT CONCAT('num的值:',num);end-- 为变量进行赋值 setCREATE PROCEDURE pro_test1()BEGIN DECLARE num int DEF ...








