学网站开发看什么书,wordpress老站开启多站点,wordpress 影视主题,宜春市住房和城乡建设局网站synchronized 和 ReentrantLock的区别 synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁#xff0c;二者的主要区别有以下 5 个#xff1a; 用法不同#xff1a;synchronized 可以用来修饰普通方法、静态方法和代码块#xff0c;而 ReentrantLock 只能用于代码块… synchronized 和 ReentrantLock的区别 synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁二者的主要区别有以下 5 个 用法不同synchronized 可以用来修饰普通方法、静态方法和代码块而 ReentrantLock 只能用于代码块。ReentrantLock 在使用之前需要先创建 ReentrantLock 对象然后使用 lock 方法进行加锁使用完之后再调用 unlock 方法释放锁获取锁和释放锁的机制不同synchronized 是自动加锁和释放锁的而 ReentrantLock 需要手动加锁和释放锁。锁类型不同synchronized 是非公平锁而 ReentrantLock 默认为非公平锁也可以手动指定为公平锁。响应中断不同ReentrantLock 可以响应中断解决死锁的问题而 synchronized 不能响应中断。底层实现不同synchronized 是 JVM 层面通过监视器实现的而 ReentrantLock 是基于 AQS 实现的。 ConcurrentHashMap的底层实现
为什么ConcurrentHashMap是线程安全的 ConcurrentHashMap是线程安全的数组,是HashTable的替代品,同为线程安全,其性能要比HashTable更好 。 1、在 JDK 1.7 中它使用的是数组加链表的形式实现的而数组又分为大数组 Segment 和小数组 HashEntry。大数组 Segment 可以理解为 MySQL 中的数据库而每个数据库Segment中又有很多张表 HashEntry每个 HashEntry 中又有多条数据这些数据是用链表连接的。 Segment 本身是基于 ReentrantLock 实现的加锁和释放锁的操作这样就能保证多个线程同时访问 ConcurrentHashMap 时同一时间只有一个线程能操作相应的节点这样就保证了 ConcurrentHashMap 的线程安全了。 2、在JDK 1.8 中 ConcurrentHashMap 使用的是数组链表/红黑树的方式实现的 它是通过 CAS 或 synchronized 来实现线程安全的并且它的锁粒度更小查询性能也更高。 多态的实现原理 和 实现方法 多态的实现原理主要是依靠“动态绑定”和“虚拟方法调用”它的实现流程如下 动态绑定Dynamic Binding指的是在编译时Java 编译器只能知道变量的声明类型而无法确定其实际的对象类型。而在运行时Java 虚拟机JVM会通过动态绑定来解析实际对象的类型。这意味着编译器会推迟方法的绑定即方法的具体调用到运行时。正是这种动态绑定机制使得多态成为可能。 虚拟方法调用是在运行时根据实际对象的类型来确定要调用的方法的机制。当通过父类类型的引用变量调用被子类重写的方法时虚拟机会根据实际对象的类型来确定要调用的方法版本而不是根据引用变量的声明类型。 通过方法重写和方法重载来实现 ${} 和 #{} 有什么区别 ${} 和 #{} 都是 MyBatis 中用来替换参数的它们都可以将用户传递过来的参数替换到 MyBatis 最终生成的 SQL 中。它们二者的区别主要体现在1、功能不同${} 是直接替换而 #{} 是预处理2、使用场景不同普通参数使用 #{}如果传递的是 SQL 命令或 SQL 关键字需要使用 ${}但在使用前一定要做好安全验证3、安全性不同使用 ${} 存在安全问题而 #{} 则不存在安全问题。 select idgetUserById resultTypecom.example.demo.model.UserInfoselect * from userinfo where id${id}
/select select idgetUserById resultTypecom.example.demo.model.UserInfoselect * from userinfo where id#{id}
/select