package com.www.java1;
/**
* 使用同步机制将单例模式中的懒汉机制改写为线程安全的
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class BankTest {
public static void main(String[] args) {
}
}
class Bank{
private Bank(){
}
private static Bank instance = null;
public static Bank getBank(){
//方式一:效率稍差
// synchronized (Bank.class){
//
// if(instance == null){
// instance = new Bank();
// }
// return instance;
// }
//方式二:效率稍高(刚开始几个线程可能由于几乎同时到达if判断导致一起等待同步代码块,速度和方式一一样,
// 但后面比较慢的线程就不需要进入同步代码块了,直接if判断后,离开)
if(instance == null){
synchronized (Bank.class){
if(instance == null){
instance = new Bank();
}
}
}
return instance;
}}
package com.www.java1;
/**
* 演示线程的死锁问题
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class ThreadTest {
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer();
new Thread(){
@Override
public void run() {
synchronized(s1){
s1.append("a");
s2.append(1);
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s2){
s1.append("b");
s2.append(2);
System.out.println(s1);
System.out.println(s2);
}
}
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized(s2){
s1.append("c");
s2.append(3);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s1){
s1.append("d");
s2.append(4);
System.out.println(s1);
System.out.println(s2);
}
}
}
}).start();
}
}