diff --git a/src/com/demo/tank/course5/singleton/Singleton1.java b/src/com/demo/tank/course5/singleton/Singleton1.java new file mode 100644 index 0000000..fcfc14d --- /dev/null +++ b/src/com/demo/tank/course5/singleton/Singleton1.java @@ -0,0 +1,22 @@ +package com.demo.tank.course5.singleton; + +/* + * 饿汉式 + * 类加载到内存后,就实例化一个单例,JVM保证线程安全 + * 缺点: 不管用到与否,类加载时就完成实例化 + * */ +public class Singleton1 { + private static final Singleton1 INSTANCE = new Singleton1(); + + private Singleton1() { + } + + public static Singleton1 getInstance() { + return INSTANCE; + } + + public static void main(String[] args) { + Singleton1 singleton = Singleton1.getInstance(); + System.out.println(singleton); + } +} diff --git a/src/com/demo/tank/course5/singleton/Singleton2.java b/src/com/demo/tank/course5/singleton/Singleton2.java new file mode 100644 index 0000000..711c9eb --- /dev/null +++ b/src/com/demo/tank/course5/singleton/Singleton2.java @@ -0,0 +1,23 @@ +package com.demo.tank.course5.singleton; + +/* + * 同1 + * */ +public class Singleton2 { + private static final Singleton2 INSTANCE; + static { + INSTANCE = new Singleton2(); + } + + private Singleton2() { + } + + public static Singleton2 getInstance() { + return INSTANCE; + } + + public static void main(String[] args) { + Singleton2 singleton = Singleton2.getInstance(); + System.out.println(singleton); + } +} diff --git a/src/com/demo/tank/course5/singleton/Singleton3.java b/src/com/demo/tank/course5/singleton/Singleton3.java new file mode 100644 index 0000000..6106cb6 --- /dev/null +++ b/src/com/demo/tank/course5/singleton/Singleton3.java @@ -0,0 +1,27 @@ +package com.demo.tank.course5.singleton; + +/* + * 懒汉式 lazy loading + * 虽然达到了按需初始化的目的, 但却带来了线程不安全问题 + * */ +public class Singleton3 { + private static Singleton3 INSTANCE; + + private Singleton3() { + } + + public static Singleton3 getInstance() { + if(INSTANCE == null){ + INSTANCE = new Singleton3(); + } + return INSTANCE; + } + + public static void main(String[] args) { + Singleton3 singleton = Singleton3.getInstance(); + //多线程 访问可能造成new出多个实例 第一个线程判读为null的时候还没new完对象 第二个线程进来,也new了一个对象 + for (int i=0; i< 100; i++){ + new Thread(() -> System.out.println(singleton.hashCode())).start(); + } + } +} diff --git a/src/com/demo/tank/course5/singleton/Singleton4.java b/src/com/demo/tank/course5/singleton/Singleton4.java new file mode 100644 index 0000000..16d6455 --- /dev/null +++ b/src/com/demo/tank/course5/singleton/Singleton4.java @@ -0,0 +1,27 @@ +package com.demo.tank.course5.singleton; + +/* + * 懒汉式 lazy loading + * 虽然达到了按需初始化的目的, 加锁 效率降低 + * */ +public class Singleton4 { + private static Singleton4 INSTANCE; + + private Singleton4() { + } + + public static synchronized Singleton4 getInstance() { + if(INSTANCE == null){ + INSTANCE = new Singleton4(); + } + return INSTANCE; + } + + public static void main(String[] args) { + Singleton4 singleton = Singleton4.getInstance(); + //多线程 访问可能造成new出多个实例 第一个线程判读为null的时候还没new完对象 第二个线程进来,也new了一个对象 + for (int i=0; i< 100; i++){ + new Thread(() -> System.out.println(singleton.hashCode())).start(); + } + } +} diff --git a/src/com/demo/tank/course5/singleton/Singleton5.java b/src/com/demo/tank/course5/singleton/Singleton5.java new file mode 100644 index 0000000..696a22b --- /dev/null +++ b/src/com/demo/tank/course5/singleton/Singleton5.java @@ -0,0 +1,29 @@ +package com.demo.tank.course5.singleton; + +/* + * 懒汉式 lazy loading + * 虽然达到了按需初始化的目的, 加锁, 加在代码块上 + * */ +public class Singleton5 { + private static Singleton5 INSTANCE; + + private Singleton5() { + } + + //线程不安全,同3类似 + public static Singleton5 getInstance() { + if(INSTANCE == null){ + synchronized (Singleton5.class){ + INSTANCE = new Singleton5(); + } + } + return INSTANCE; + } + + public static void main(String[] args) { + Singleton5 singleton = Singleton5.getInstance(); + for (int i=0; i< 100; i++){ + new Thread(() -> System.out.println(singleton.hashCode())).start(); + } + } +} diff --git a/src/com/demo/tank/course5/singleton/Singleton6.java b/src/com/demo/tank/course5/singleton/Singleton6.java new file mode 100644 index 0000000..083b0de --- /dev/null +++ b/src/com/demo/tank/course5/singleton/Singleton6.java @@ -0,0 +1,29 @@ +package com.demo.tank.course5.singleton; + +/* + * 懒汉式 lazy loading + * 虽然达到了按需初始化的目的, 同步代码块 + * */ +public class Singleton6 { + private static volatile Singleton6 INSTANCE; + + private Singleton6() { + } + + public static synchronized Singleton6 getInstance() { + synchronized (Singleton6.class){ + //双重检查 + if(INSTANCE == null) { + INSTANCE = new Singleton6(); + } + } + return INSTANCE; + } + + public static void main(String[] args) { + Singleton6 singleton = Singleton6.getInstance(); + for (int i=0; i< 100; i++){ + new Thread(() -> System.out.println(singleton.hashCode())).start(); + } + } +} diff --git a/src/com/demo/tank/course5/singleton/Singleton7.java b/src/com/demo/tank/course5/singleton/Singleton7.java new file mode 100644 index 0000000..366ecdd --- /dev/null +++ b/src/com/demo/tank/course5/singleton/Singleton7.java @@ -0,0 +1,25 @@ +package com.demo.tank.course5.singleton; + +/* + * 静态内部类方式 jvm保证单例 + * 加载外部类时不会加载内部类,这样实现了懒加载 + * */ +public class Singleton7 { + + private Singleton7() { + } + + private static class SingletonHolder{ + private static Singleton7 INSTANCE = new Singleton7(); + } + public static synchronized Singleton7 getInstance() { + return SingletonHolder.INSTANCE; + } + + public static void main(String[] args) { + Singleton7 singleton = Singleton7.getInstance(); + for (int i=0; i< 100; i++){ + new Thread(() -> System.out.println(singleton.hashCode())).start(); + } + } +} diff --git a/src/com/demo/tank/course5/singleton/Singleton8.java b/src/com/demo/tank/course5/singleton/Singleton8.java new file mode 100644 index 0000000..0ca98d1 --- /dev/null +++ b/src/com/demo/tank/course5/singleton/Singleton8.java @@ -0,0 +1,15 @@ +package com.demo.tank.course5.singleton; + +/* + * 枚举方式, 不仅解决了线程同步,也防止了反序列化 + * */ +public enum Singleton8 { + + INSTANCE; + + public static void main(String[] args) { + for (int i=0; i< 100; i++){ + new Thread(() -> System.out.println(Singleton8.INSTANCE.hashCode())).start(); + } + } +} diff --git a/src/com/demo/tank/course5/strategy/Cat.java b/src/com/demo/tank/course5/strategy/Cat.java new file mode 100644 index 0000000..1655721 --- /dev/null +++ b/src/com/demo/tank/course5/strategy/Cat.java @@ -0,0 +1,26 @@ +package com.demo.tank.course5.strategy; + +public class Cat implements Comparable{ + private int weight; + private int height; + + public Cat(int weight, int height) { + this.weight = weight; + this.height = height; + } + + @Override + public String toString() { + return "Cat{" + + "weight=" + weight + + ", height=" + height + + '}'; + } + + @Override + public int compareTo(Cat c) { + if(this.weight < c.weight) return -1; + else if(this.weight > c.weight) return 1; + else return 0; + } +} diff --git a/src/com/demo/tank/course5/strategy/CatHeightComparator.java b/src/com/demo/tank/course5/strategy/CatHeightComparator.java new file mode 100644 index 0000000..0dbe4c7 --- /dev/null +++ b/src/com/demo/tank/course5/strategy/CatHeightComparator.java @@ -0,0 +1,8 @@ +package com.demo.tank.course5.strategy; + +public class CatHeightComparator implements Comparator{ + @Override + public int compareTo(Cat t1, Cat t2) { + return 0; + } +} diff --git a/src/com/demo/tank/course5/strategy/CatWeightComparator.java b/src/com/demo/tank/course5/strategy/CatWeightComparator.java new file mode 100644 index 0000000..d674884 --- /dev/null +++ b/src/com/demo/tank/course5/strategy/CatWeightComparator.java @@ -0,0 +1,8 @@ +package com.demo.tank.course5.strategy; + +public class CatWeightComparator implements Comparator{ + @Override + public int compareTo(Cat t1, Cat t2) { + return 0; + } +} diff --git a/src/com/demo/tank/course5/strategy/Comparator.java b/src/com/demo/tank/course5/strategy/Comparator.java new file mode 100644 index 0000000..1c9008d --- /dev/null +++ b/src/com/demo/tank/course5/strategy/Comparator.java @@ -0,0 +1,5 @@ +package com.demo.tank.course5.strategy; + +public interface Comparator { + int compareTo(T t1, T t2); +} diff --git a/src/com/demo/tank/course5/strategy/Dog.java b/src/com/demo/tank/course5/strategy/Dog.java new file mode 100644 index 0000000..58496b9 --- /dev/null +++ b/src/com/demo/tank/course5/strategy/Dog.java @@ -0,0 +1,23 @@ +package com.demo.tank.course5.strategy; + +public class Dog implements Comparable{ + int food; + + public Dog(int food) { + this.food = food; + } + + @Override + public String toString() { + return "Dog{" + + "food=" + food + + '}'; + } + + @Override + public int compareTo(Dog d) { + if(this.food < d.food) return -1; + else if(this.food > d.food) return 1; + else return 0; + } +} diff --git a/src/com/demo/tank/course5/strategy/DogComparator.java b/src/com/demo/tank/course5/strategy/DogComparator.java new file mode 100644 index 0000000..68912dc --- /dev/null +++ b/src/com/demo/tank/course5/strategy/DogComparator.java @@ -0,0 +1,10 @@ +package com.demo.tank.course5.strategy; + +public class DogComparator implements Comparator{ + @Override + public int compareTo(Dog d1, Dog d2) { + if(d1.food < d2.food) return -1; + else if(d1.food > d2.food) return 1; + else return 0; + } +} diff --git a/src/com/demo/tank/course5/strategy/Sorter.java b/src/com/demo/tank/course5/strategy/Sorter.java new file mode 100644 index 0000000..e20187e --- /dev/null +++ b/src/com/demo/tank/course5/strategy/Sorter.java @@ -0,0 +1,29 @@ +package com.demo.tank.course5.strategy; + +import java.util.Arrays; + +public class Sorter { + public void sort(T[] arr, Comparator comparator){ + for (int i = 0; i < arr.length - 1; i++) { + int minPos = i; + for (int j = i+1; j < arr.length; j++) { + minPos = comparator.compareTo(arr[j], arr[minPos]) == -1 ? j : minPos; + } + swap(arr, i, minPos); + } + } + + private void swap(T[] arr, int i, int minPos) { + T temp = arr[i]; + arr[i] = arr[minPos]; + arr[minPos] = temp; + } + + public static void main(String[] args) { + Dog[] dogs = new Dog[]{new Dog(5), new Dog(1), new Dog(6)}; + Cat[] cats = new Cat[]{new Cat(6,2), new Cat(3,4), new Cat(5,5)}; + Sorter sorter = new Sorter<>(); + sorter.sort(dogs, new DogComparator()); + System.out.println(Arrays.toString(dogs)); + } +}