【算法】手写单例模式 LRU 死锁 快排

1、手写单例模式

双重检查锁(DCL)

  • 属性是static volatile的,主要是为了防止指令重排
  • 构造函数私有化防止外部实例化对象
  • getInstance函数中,双重检查中间加个类锁
  • 可用在并发环境下
public class Singleton{
	public static volatile Singleton singleton;
	
	//构造函数私有化,防止外部实例化对象
	private Singleton() {};
	//双重检查锁
	public static Singleton getInstance(){
		if (singleton == null){
			synchronized (Singleton.class){
				if (singleton == null){
					singleton = new Singleton();
				}
			}
		}
		return singleton;
	}
}

2、手写LRU

使用LinkedHashMap

class LRUCache {
    int cap;
    LinkedHashMap<Integer, Integer> cache = new LinkedHashMap<>();
    public LRUCache(int capacity) { 
        this.cap = capacity;
    }
    
    public int get(int key) {
        if (!cache.containsKey(key)) {
            return -1;
        }
        // 将 key 变为最近使用
        makeRecently(key);
        return cache.get(key);
    }
    
    public void put(int key, int val) {
        if (cache.containsKey(key)) {
            // 修改 key 的值
            cache.put(key, val);
            // 将 key 变为最近使用
            makeRecently(key);
            return;
        }
        
        if (cache.size() >= this.cap) {
            // 链表头部就是最久未使用的 key
            int oldestKey = cache.keySet().iterator().next();
            cache.remove(oldestKey);
        }
        // 将新的 key 添加链表尾部
        cache.put(key, val);
    }
    
    private void makeRecently(int key) {
        int val = cache.get(key);
        // 删除 key,重新插入到队尾
        cache.remove(key);
        cache.put(key, val);
    }
}

3、手写死锁

public class DeadLockDemo {
    private static Object resource1 = new Object();//资源 1
    private static Object resource2 = new Object();//资源 2

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (resource1) {
                System.out.println(Thread.currentThread() + "get resource1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource2");
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                }
            }
        }, "线程 1").start();

        new Thread(() -> {
            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource1");
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                }
            }
        }, "线程 2").start();
    }
}

4、手写快排

public static int partition(int[] array, int low, int high) {
    int pivot = array[high];
    int pointer = low;
    for (int i = low; i < high; i++) {
        if (array[i] <= pivot) {
            int temp = array[i];
            array[i] = array[pointer];
            array[pointer] = temp;
            pointer++;
        }
        System.out.println(Arrays.toString(array));
    }
    int temp = array[pointer];
    array[pointer] = array[high];
    array[high] = temp;
    return pointer;
}
public static void quickSort(int[] array, int low, int high) {
    if (low < high) {
        int position = partition(array, low, high);
        quickSort(array, low, position - 1);
        quickSort(array, position + 1, high);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FIFO算法、OPT算法LRU算法是常见的页面置换算法,它们都用于解决操作系统中的页面置换问题。下面是它们的缺页率比较: 1. FIFO算法(先进先出算法): - 算法介绍:FIFO算法是最简单的页面置换算法,它总是选择最早进入内存的页面进行淘汰。 - 举例:假设内存中有3个页面,页面访问序列为1, 2, 3, 4, 1, 2, 5。使用FIFO算法进行页面置换,当内存中的页面数不足时,将最早进入内存的页面淘汰。根据这个页面访问序列,FIFO算法的缺页次数为4,缺页率为4/7=0.57。 2. OPT算法(最优页面置换算法): - 算法介绍:OPT算法是一种理论上的最优页面置换算法,它根据未来的页面访问情况选择最长时间内不再被访问的页面进行淘汰。 - 举例:假设内存中有3个页面,页面访问序列为1, 2, 3, 4, 1, 2, 5。使用OPT算法进行页面置换,根据未来的页面访问情况,选择最长时间内不再被访问的页面进行淘汰。根据这个页面访问序列,OPT算法的缺页次数为2,缺页率为2/7=0.29。 3. LRU算法(最近最久未使用算法): - 算法介绍:LRU算法是一种基于页面访问历史的页面置换算法,它选择最近最长时间没有被访问的页面进行淘汰。 - 举例:假设内存中有3个页面,页面访问序列为1, 2, 3, 4, 1, 2, 5。使用LRU算法进行页面置换,根据页面的访问历史,选择最近最长时间没有被访问的页面进行淘汰。根据这个页面访问序列,LRU算法的缺页次数为3,缺页率为3/7=0.43。 综上所述,根据给定的页面访问序列,FIFO算法的缺页率为0.57,OPT算法的缺页率为0.29,LRU算法的缺页率为0.43。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值