刷java面经

threadlocal看源码总结
场景:一个工具类很多线程要使用时,可以加锁,也可以人手一个工具。
threadlocal里面有个map,每个threadlocal都可以获得thread对象,thread里面有个属性是map。每个map存的是threadlocal–》某对象。threadlocal.set(a)就是获得当前线程的map并且存this–》a。threadlocal.get()就是获取当前线程的map并且获得a对象。
线程池拒绝策略:
抛异常,丢当前任务,丢最老的任务,直接运行任务。

(下面的取数据应该是改成取数据到写数据这段时间不能被别的线程更改,以保证该线程读的数据是正确的,可以上悲观锁不让别的线程写或者写的时候再对比一下有没有被别的线程改过)
乐观锁,乐观在取数据直接取,大不了数据被别人改了就重新取。一般都需要先读再更新数据库(这里我认为是因为多线程高并发情况下无法确认数据库的状态所以要先读),比如读版本号是多少,然后更新时对比版本号如果没有被更新过就设置版本号加一,这是数据库乐观锁实现方法之一。还有加时间戳和条件限制的乐观锁,条件限制多见于扣商品库存,允许别人更新数据库,只要还有库存就行。(i++的例子)
悲观锁,取数据要加锁,防止别人也来取。

使用场景

1、乐观锁:由于乐观锁的不上锁特性,所以在性能方面要比悲观锁好,比较适合用在DB的读大于写的业务场景。(感觉是在冲突比较少的情况下比较好)

2、悲观锁:对于每一次数据修改都要上锁,如果在DB读取需要比较大的情况下有线程在执行数据修改操作会导致读操作全部被挂载起来,等修改线程释放了锁才能读到数据,体验极差。所以比较适合用在DB写大于读的情况。

mysql乐观锁:版本号(用版本号判断这一行有没有被改过),cas。

mysql引擎区别
(事务,外键,聚簇索引;全文索引)
主要是,当系统检查到锁是重量级锁之后,会把等待想要获得锁的线程进行阻塞,被阻塞的线程不会消耗cup。但是阻塞或者唤醒一个线程时,都需要操作系统来帮忙,这就需要从用户态转换到内核态,而转换状态是需要消耗很多时间的,有可能比用户执行代码的时间还要长。
这就是说为什么重量级线程开销很大的。

《高性能mysql》,隔离级别没有例子,这是一本比较不适合新手看的书,先拿网课入门比较好。

很多时候找博客都是找的能看懂的,看不懂就换或者找书找视频。
如何避免sql注入

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

Integer源码,1.里面用了new。
2.类加载时就已经把-128到127的对象缓存进去了。
3.如果用valueOf,就会考虑使用缓存的对象。
4.判断int和Integer时会自动拆箱。
为什么看源码呢,主要是有时候看源码学习效率高,并且清晰,记得更长久。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值