fyzn12
RSS SITEMAP

Articles

  • Mysql的存储引擎

    1 mysql支持Innodb存储引擎(支持行锁) 1.1 Innodb存储引擎概述 ① Innodb存储引擎:主要面向在线事务处理(OLTP)方面的应用。特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读,即默认情况下读取操作不会产生锁。 ② InnoDB通过多版本并发控制(MVCC)来获取高并发,并实现了SQL标准的4种隔离级别,默认是repeatable级别。 ③ 使用next-key locking(临键锁)的策略来避免幻读,准确来说是临键锁加间隙锁的策略避免幻读。 这也就是为什么下面提到的非唯一索引字段数据库使用行级锁却锁定的是多行,这与间隙锁有关 ④ Innodb存储引擎的行锁是通过给索引项加锁实现,这一点musql和oracle不同,后者是通过在数据库中给对应的数据行加锁实现。 ⑤ Innodb存储引擎这种行级锁决定,只有通过索引条件来检查数据,才能使用行级锁,否则将直接用表级锁。 特别注意:使用行级锁一定要使用索引;查询非唯一索引字段数据库使用行级锁锁定多行,这个与数据库的 1.2 Innodb存储引擎内存 组成:缓冲池(buffer pool)、重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool),分别由配置文件中的参数innodb_buffer_pool_size和innodb_log_buffer_size大大小决定。 缓冲池是占最大块内存的部分,用来存放各种数据的缓存。 Innodb存储引擎的工作方式:将数据库文件按页(每页16K)读取到缓冲池,然后按最近最久未使用(LRU)的算法来保留在缓冲池中的缓存数据。如果数据库文件需要修改,总是首先修改在缓存池中的页(发生修改后,该页即为脏页),然后再按照一定的频率将缓冲池的脏页刷新(flush)到文件。可以通过命令:show engine innodb status来查看innodb_buffer_pool的具体情况。 1.3 master thread innoDB存储引擎的主要工作都是在一个单独的后台线程master thread中完成。 master thread 的线程优先级别最高。其内部由几个循环(loop)组成:主循环、后台循环、刷新循环、暂停循环。 2 MyISAM存储引擎 MyISAM存储引擎是mysql官方提供的存储引擎。其特点是不支持事务、表锁和全文索引,对于一些OLAP(在线分析处理)操作速度快。 MyISAM存储引擎表有MYD和MYI组成,MYD用来存储数据文件,MYI用来存放索引文件。
  • SynchronizedMap如何让HashMap具备线程安全

    问题:SynchronizedMap如何让HashMap具备线程安全 1. 首先利用SynchronizedMap的构造函数获取map的对象,而该构造器可以传入一个HashMap的集合作为参数 2. SynchronizedMap底层通过一个互斥信号量mutex(final Object) 进行方法同步的限定, synchronized(mutex)进行加锁,达到线程同步的效果,如下源码所示 SynchronizedMap(Map<K,V> m) { if (m==null) throw new NullPointerException(); this.m = m; mutex = this; } SynchronizedMap(Map<K,V> m, Object mutex) { this.m = m; this.mutex = mutex; } public int size() { synchronized(mutex) {return m.size();} } public boolean isEmpty(){ synchronized(mutex) {return m.isEmpty();} } public boolean containsKey(Object key) { synchronized(mutex) {return m.containsKey(key);} } 3.使用方式: Map<String,Long> user = Collections.synchronizedMap(new HashMap<>()); user.put("xsj",1234567l); System.
  • 两个链表的第一个公共节点

    题目描述:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 解题思路:采用双指针的方式遍历链表 public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if(pHead1 == null || pHead2 == null)return null; ListNode p1 = pHead1; ListNode p2 = pHead2; while(p1 != p2){ p1 = p1.next; p2 = p2.next; if(p1 != p2){ if(p1 == null)p1 = pHead1; if(p2 == null)p2 = pHead2; } } return p1; }
  • 二维数组中由1构成的最大正方形

    题目描述:给定一个由0和1组成的2维矩阵,返回该矩阵中最大的由1组成的正方形的面积 示例1 输入:[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]] 返回值:4 本体知识点:动态规划 1.初步分析如下 1.确定dp[][]数组的含义 此题的dp[i][j],代表以坐标为(i,j)的元素为右下角的正方形的边长。 2.状态转移方程 dp[i][j]的值取决于dp[i-1][j],dp[i-1][j-1],dp[i][j-1]的最小值 即左方正方形的边长,左上方正方形的边长,上方正方形的边长三者的最小值。 3.边界 由于状态转移方程中涉及i-1,j-1,所以i和j一定要大于0. 故dp[0][] 和 dp[][0]要首先确定。 /** * 最大正方形 * @param matrix char字符型二维数组 * @return int整型 */ public int solve (char[][] matrix) { //判断二维数组是否有效 if(matrix.length == 0 || matrix[0].length==0)return 0; int rows = matrix.length; int cols = matrix[0].lenght; int max; //声明数组 int[][] dp = new int[rows][cols]; //确定边界值 for(int i = 0;i<rows;i++){ if(matrix[i][0] == '1')dp[i][0] = 1; } for(int j = 0;j<cols;j++){ if(matrix[0][j]=='1')dp[0][j] = 1; } //确定中间值 for(int i = 1; i < rows;i++){ for(int j = 1;j<cols;j++){ if(matrix[i][j]=='1'){ dp[i][j] = Math.
  • 链表求和及字符串求和

    1.对字符串求和 题目描述: 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。 (字符串长度不大于100000,保证字符串仅由’0’~‘9’这10种字符组成) 输入:”1”,“99” 输出:”100” /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ public String solve (String s, String t) { int i = s.length()-1,j = t.length()-1,carry=0; StringBuilder str = new StringBuilder(); while(i>=0 || j>=0 || carry!=0){ int x = i<0?0:s.charAt(i--)-'0'; int y = j<0?0:t.charAt(j--)-'0'; str.apend((x+y+carry)%10); carry = (x+y+carry)/10; } return str.reverse().toString(); } 2.链表的求和 3.