高并发编程基础1(bjsxt学习笔记)
并发编程大概主要涉及三个概念:
多线程、监视器、对象。 其中监视器也可以叫做锁。
(1)怎么给对象加监视器?
例如,synchronized(对象)就是给该对象加上了监视器。
或者,某个类中出现了ReentrantLock成员字段,并且给某段代码加了锁。那么该对象也加了监视器
(2)通过给对象加监视器,达到多线程同步访问对象内同步方法、或同步代码块。
当某个线程T获得了该对象监视器,那么其余想要获取该对象监视器的线程,必须等待T放开该监视器(解锁),然后再去获取。(其余线程连该对象监视器都没获取,当然不能执行该对象下的任意一个同步方法。但是非同步方法,没有限制)
对象监视器的作用:多线程环境下,访问同一个对象,如何确保数据安全?给对象加一个监视器。
当某个线程进入了synchronizedi修饰的方法,那就称为,该线程拥有了该对象监视器。
1、一个类继承了父类的同步方法,相当于重入
2、volatile(不稳定的)关键字:通知os操作系统底层,在cpu计算过程中,都要检查内存中数据的有效性。保证最新的内存数据被使用
volatile只保证内存可见性,不能保证原子性(多线程环境下同步操作)
3、后自加
int i = 0;
System.out.println(i++); // 打印0 先执行方法,之后 i 加1
4、atomicInteger,并发包下的具有原子性的Integer类。
5、不建议使用同步方法,建议使用同步代码块,粒度越细越好。尤其是高并发时,
因为粒度太粗的话,一个线程进入该方法、或者方法块之后,可能耗时太长,
影响其他线程进入该方法、其他同步方法(块)。
举例:一个食堂,如果整个食堂加同步,那一次只能一个同学进入,等这个同学打饭、吃饭之后,其他人才能进入。
6、操作引用就是操作地址
7、计数渐减门闩
8、对象调用wait方法的作用:让当前线程在该对象的监视器上等待(这也是为什么会释放锁)
对象监视器的作用:多线程环境下,访问同一个对象,如何确保数据安全?给对象加一个监视器。
9、练习题
自定义容器,提供新增元素(add)和获取元素数量(size)方法。
启动两个线程。线程1向容器中新增10个数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止。