1.并发就是对共享资源同时进行访问,而产生的现象。
2.线程的实现方式:继承Thread或实现runnable 都要重写run方法。
3.启动线程是通过Thread的start(用户进程)方法实现的。如果直接调用run(守护进程)方法启动的线程和当前主线生命是同时结束的。
4.共享变量:多个线程对同一个变量进行访问时,都是先从jmm主内存读取变量的值到自己的本地内存,等线程运行结束了后再把自己当前线程中本地变量的值刷回主内存。这样在多线程同时访问的情况下就会产生数据的紊乱和覆盖。
此时需要给共享变量增加volatile 来保证多线程之间共享变量的可见性,当变量被volatile修饰后各个线程自己的本地内存就不在起作用,而是直接读取jmm主内存中的值,修改完在放回去,当共享变量的值发生变化时会通知各个线程。
但是volatile不具有原子性,可能存在同时写数据的情况,此时就要在写操作时加锁。
5.并发的解决方式主要是通过加锁来实现的。锁有两类:分别是对象锁(synchronized (this)、方法加synchronized )和类锁(static synchronized 和 synchronized (*.class))
锁synchronized 同步代码块和Reentrantlock 的区别:
lock 可以实现公平锁,等待时间较长的优先处理;synchronized 每次都要竞争锁。
lock需要解锁操作;
lock可以设置超时时间自动释放锁;
在竞争不是很激烈 偶尔才有并发的情况下使用synchronized,在并发量大的情况下使用ReenableLock性能要好很多。
两者都能实现 原子性(一次只能有一个线程执行)、可见性和可重入性。