雪一更--软件开发--Java--JMM--JUC
目的: 掌握 安全发布,同步策略的规范以及一致性, 而它们的安全性全都来自于JVM. 所以从底层抓起.
thanks reference:
1.<JUC>
1. 目的:多线程的效率提升,
带来的问题:多个线程所看到的对象不一致,
数据竞争,对象的初始化状态不一致,
安全标准:
不可变对象的初始化,能防止在自身完全被构造前,被其他线程读取域。
域可达的初始变量,或final 域引用的 HashMap 的内容,同样对其他线程可见.
/** * 初始化安全性意味着: * 1.即使通过不安全的延迟初始化 * 2.在没有同步的情况下将 SafeStates 的引用放在一个公有的静态域. * 3.没有使用同步以及依赖于非线程安全的 HashSet。 */ public class SafeStates { private final Map<String, String> states; public SafeStates(Map<String, String> states) { this.states = new HashMap<>(); states.put("alaska", "AK"); states.put("alabama", "AL"); } public String getAbbreviation(String s) { return states.get(s); } }
2. 死锁及检测:
2.1 死锁,互相持有对方需要的锁才能进行下一步.


public class DeadlockDemo { private final Object lock1 = new Object(); private final Object lock2 = new Object(); public void instanceMethod1(){ synchronized (lock1){ synchronized (lock2){ System.out.println("first thread in instance method1"); } } } public void instanceMethod2(){ synchronized (lock2){ synchronized (lock1){ System.out.println("second thread in instance method2"); } } } }
public class DemoMain { public static void main(String... args){ final DeadlockDemo deadlockDemo = new DeadlockDemo(); Runnable r1 = new Runnable() { public void run() { while(true){ deadlockDemo.instanceMethod1(); try{ Thread.sleep(50); }catch (InterruptedException e){ } } } }; Runnable r2 = new Runnable() { public void run() { while(true){ deadlockDemo.instanceMethod2(); try{ Thread.sleep(50); }catch (InterruptedException e){ } } } }; Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); t1.start(); t2.start(); } }
避免死锁的最简单方式:阻止同步方法或者同步块调用其他的同步方法或同步块.

浙公网安备 33010602011771号