雪一更--软件开发--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();
    }
}
View Code

避免死锁的最简单方式:阻止同步方法或者同步块调用其他的同步方法或同步块.


 

posted @ 2023-09-16 19:03  君子之行  阅读(8)  评论(0)    收藏  举报