并发编程总结

来源:互联网 发布:yunos删除预装软件 编辑:程序博客网 时间:2024/06/04 22:02

一、并发基础

1、用synchronized来修饰一个方法,如同给一个方法上了一把锁,当多个线程同时访问这个方法,每个线程都要先拿到这个锁才能执行这个方法,执行完方法之后释放锁,其他的线程继续“竞争锁”来抢锁,抢到之后执行再释放,循环结束。

2、多个线程多个锁,一个对象有一把锁,如果想用多个对象共享一把锁,用static修饰synchronized方法和变量,那么这个方法就是类级别的锁,无论多少个对象,获得的都是同一把类锁,而不是原来获取的对象锁。

3、如果同一个对象里面的方法有同步方法和异步方法,异步方法不需要获得锁直接执行,同步方法依然需要去竞争锁。

4、脏读:脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的;

5、synchronized 锁重入,同步方法中调用同步方法,子类的同步方法继承父类的同步方法使用。

6、如果在同步方法的执行过程中碰到异常,会立马释放锁,让其他线程进入方法

7、对象加锁之后,如果对象发生改变,对象的锁就会释放。对象的属性发生改变是不影响对象锁。

8、字符常量加锁,需要new一个新的字符对象,因为字符串在内存中是指向同一个常量

9,使用volatile关键字在修饰变量,是这个变量在多个线程中可见,不具备原子性,公用,JDK1.5之后,在开启一个线程之后,jvm会在内存中开辟一个空间用以存放当前线程从主内存中copy过来的变量,使用的过程中和主内存中的变量是互相不干扰的,如果想要互通,那么需要使用volatile关键字修饰变量,在线程操作过变量之后,会同步到主内存之中。

10、如果想要volatile关键字修饰的变量具有原子性,可以使用原子类(AtomicInteger、AtomicBoolean...等等.)来替代volatile,volatile只具备多个线程可见的特性,算是一个轻量级的synchronized,不具有原子性。

11、Atomic只能保证本身方法的原子性,不能保证多个线程之间的原子性,想要保证多个线程之间的原子性,只能在外部加一把锁。

二、线程之间通信

12、使用wait,notify方法来实现线程之间的通信,这个两个方法是object的方法,必须配合sychronized方法使用,wait方法是释放锁,notify方法是不释放锁。

13,、可以使用CountDownLatch来实现线程之间的通信,countDownLatch相当于wait和notify的升级版,不需要搭配sychronized使用,countDownLatch.countDown();释放锁,countDownLatch.await();发起等待,把线程的控制权交给其他线程。


原创粉丝点击