VOLATILE解析
VOLATILE与SYNCHRONIZED
-
volatile是在取数的时候的可见性、有序性 synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住有原子性,保证变量的修改可见性和原子性. .
-
volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
-
volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
-
volatile开销相对synchronized
-
i++其实是两步操作先取数i然后i+1 volatile修饰的时候无法保证其原子性的
JAVA的wait与notify
wait和notify配合synchronized(obj)使用的。
然后调用锁的对象obj的wait方法,此时此线程处于等待状态然后线程的锁被释放掉这个线程处于等待状态,这是另外一个锁这个对象的线程获得锁的对象可以调用notify方法唤醒被锁的线程,但是此时这个锁还没被释放知道这个锁内的方法执行完毕。但是这个notify方法唤醒是随机唤醒的。
###yield和join方法 Java线程中yield与join方法的区别
Yield是一个静态的原生(native)方法 Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。 Yield不能保证使得当前正在运行的线程迅速转换到可运行的状态 它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态
t.join()方法阻塞调用此方法的线程(calling thread),直到线程t完成,此线程再继续;通常用于在main()主线程内,等待其它线程完成再结束main()主线程
sleep 方法使当前运行中的线程睡眠一段时间,进入不可以运行状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的
sleep 方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,所以不可能让出较低优先级的线程此时获取CPU占有权。 在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。
Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)
Java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)
Java并发编程(6):Runnable和Thread实现多线程的区别(含代码)
Java并发编程(7):使用synchronized获取互斥锁的几点说明
Java并发编程(8):多线程环境中安全使用集合API(含代码)