共享性,互斥性,原子性,可见性,有序性html
http://www.cnblogs.com/paddix/p/5374810.htmljava
********* https://mp.weixin.qq.com/s/anqQfO7bWpNTcS6Po4Rkww并发
Synchronized及其实现原理 http://www.cnblogs.com/paddix/p/5367116.html异步
Synchronized是Java中解决并发问题的一种最经常使用的方法,也是最简单的一种方法。Synchronized的做用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改可以及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:ide
(1)修饰普通方法性能
(2)修饰静态方法优化
(3)修饰代码块spa
每一个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的全部权,过程以下:.net
一、若是monitor的进入数为0,则该线程进入monitor,而后将进入数设置为1,该线程即为monitor的全部者。线程
二、若是线程已经占有该monitor,只是从新进入,则进入monitor的进入数加1.
3.若是其余线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再从新尝试获取monitor的全部权。
执行monitorexit的线程必须是objectref所对应的monitor的全部者。
指令执行时,monitor的进入数减1,若是减1后进入数为0,那线程退出monitor,再也不是这个monitor的全部者。其余被这个monitor阻塞的线程能够尝试去获取这个 monitor 的全部权。
所以 Synchronized的语义底层是经过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为何只有在同步的块或者方法中才能调用wait/notify等方法,不然会抛出java.lang.IllegalMonitorStateException的异常的缘由。
轻量级锁所适应的场景是线程交替执行同步块的状况,若是存在同一时间访问同一锁的状况,就会致使轻量级锁膨胀为重量级锁。
偏向锁则是在只有一个线程执行同步块时进一步提升性能。
http://www.cnblogs.com/paddix/p/5405678.html
http://www.cnblogs.com/paddix/p/5381958.html
http://www.cnblogs.com/paddix/p/5428507.html
说白了volatile修饰的变量,JVM保证了每次读变量都从主内存中读,而不是从主内存中copy到线程中到副本,不会由于两份不一致致使,提供可见行。
当线程操做对volatile变量进行写操做时,JMM会将该线程的本地内存中的副本变量刷新到主存中去;当线程对volatile变量进行读操做时,线程先将本地内存共享变量设置为无效,线程就会从主存中读取共享变量的值了。
编译器不会对volatile修饰的变量指令进行重排,保证顺序一致性。
但它不能保证一致性
实现线程的方式:主要使用Runnable,Callable,Thread或者线程池。
class ThreeCallable implements Callable<Integer>{
public Integer call() throws Exception {
int i = 0;
for(;i<100;i++)
{
System.out.println(Thread.currentThread().getName()+" "+i);
}
return i;
}
}
ThreeCallable threeCallable = new ThreeCallable();
FutureTask<Integer> ft = new FutureTask<Integer>(threeCallable);
new Thread(ft).start();
System.err.println("ft:"+ft.get());
Runnable,Callable的区别?
实现方法名称不同,Callable规定的方法是call(),Runnable规定的方法是run()。
Callable的任务执行后可返回值,而Runnable的任务是不能返回值得。
call()能够抛出异常,run()不能够。
运行Callable任务能够拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。经过Future对象能够了解任务执行状况,可取消任务的执行,还可获取执行结果。