前言:
整理下学习笔记,打好基础,daydayup!!!
线程安全
多线程可以同时进行操作,但如果是同时操作一个共享资源的时候,可能会出现业务安全问题。
示例:
小A和小B共用一个账户,如果小A和小B同时取钱,谁能够取走钱?
在没有线程安全的情况下,小A和小B都能够取走钱,导致金额最终为负数。所以为了解决这一情况,就需要解决线程安全问题
线程同步
线程同步就是解决线程安全的方案
线程同步的思想
让多个线程先后依次访问共享资源,解决线程安全问题
线程同步的常见方案
使用加锁的方式。每次只允许一个线程加锁,加锁后才能进入访问,访问完毕后自动解锁,然后其他线程才能再加锁进来
1,同步代码块
作用:把访问共享资源的核心代码给上锁,以次保证线程安全。
格式:
synchronized(同步锁){
访问共享资源的核心代码
}
原理: 每次只允许一个线程加锁后进入,执行完毕后自动解锁,其他线程才可以进来执行。
示例:
注:对于当前同时执行的线程来讲,必须是同一个对象执行程序,否则会出想bug。
2,同步方法
作用:把访问共享资源的核心方法给上锁,以此保证线程安全
格式:
修饰符synchronized 返回值类型 方法名称(形参列表){
操作共享资源的代码
}
原理:每次只能一个线程进入,执行完毕以后自动解锁,其他线程才可以进来执行
3,Lock锁
Lock是接口,不能直接实例化,可以采用它的实现类ReentrantLock来构建Lock锁对象
格式:
private Lock 名称 = new ReentrantLock();
方法{
名称.lock();
需要加锁的代码
名称.unlock();
}
示例:
总结:
同步代码块相对灵活,但代码多时,可观性较差;同步方法相对死板,但可观性较好;Lock锁相比前两种方法更加灵活,但操作比前两种更为复杂,可观性较差。整理结束,撒花!!!