在《Volatile 关键字(上)》一文中遗留了一个问题,就是 volatile 只修饰了 missedIt 变量,而没修饰value 变量,但是在线程读取 value 的值的时候,也读到的是最新的数据。下面讲解问题出现的原因。
volatile 用处说明在 JDK1.2 之前,Java 的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而随着 JVM 的成熟和优化,现在在多线程环境下 volatile 关键字的使用变得非常重要。在当前的 Java 内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。
守护线程Java 中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程。
挂起和恢复线程Thread 的 API 中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的。如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件——其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁。另外,在长时间计算期间挂起线程也可能导致问题。
使用 interrupt()中断线程当一个线程运行时,另一个线程可以调用对应的 Thread 对象的 interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是,如果只是单纯的调用 interrupt()方法,线程并没有实际被中断,会继续往下执行。
Java 中实现多线程有两种方法:继承 Thread 类、实现 Runnable 接口,在程序开发中只要是多线程,肯定永远以实现 Runnable 接口为主,因为实现 Runnable 接口相比继承 Thread 类有如下优势:可以避免由于 Java 的单继承特性而带来的局限;增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;适合多个相同程序代码的线程区处理同一资源的情况。
在过去单 CPU 时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 CPU,并交由操作系统来完成多任务间对 CPU 的运行切换,以使得每个任务都有机会获得一定的时间片运行。
全面记录了 Java 并发编程的相关知识,包括 Java 5 新增加的并发包内的相关类,分析了并发编程中的常见问题,并深入 Java 内存模型,对底层并发机制的实现做了一些分析。如果你正在编写、设计、调试、维护以及分析多线程的 Java 程序,那么本书正是你需要的。适用人群本书适合 Java 程序开发人员阅读。前提准备熟悉 Java 语法,了解 Java 面向对象编程思想。
在控制台显示 SQL 语句用过 Hibernate 的人都知道,Hibernate 是可以配置 show_sql 显示 自动生成的 SQL 语句,用 format_sql 可以格式化 SQL 语句,但如果用 Mybatis 怎么实现这个功能呢, 可以通过配置日志来实现的,比如配置我们最常用的 log4j.properties 来实现。log4j.properties 内容log4j.rootCategory=info, stdout , Rlog4j.appender.stdout=org.apache.log4j.
前面的系列 Mybatis 文章,已经基本讲到了 Mybatis 的操作,但都是基于 mapper 隐射操作的,在 Mybatis 3 中这个 mapper 接口貌似充当了以前在 ibatis 2 中的 DAO 层的作用。但事实上,如果有这个 mapper 接口不能完成的工作,或者需要更复杂的扩展的时候,你就需要自己的 DAO 层. 事实上 Mybatis 3 也是支持 DAO 层设计的,类似于 ibatis 2 。下面介绍下。
Mybatis 应用程序,需要大量的配置文件,对于一个成百上千的数据库表来说,完全手工配置,这是一个很恐怖的工作量. 所以 Mybatis 官方也推出了一个 Mybatis 代码生成工具的 jar 包.
Mybatis 的动态 SQL 语句是基于 OGNL 表达式的。可以方便的在 SQL 语句中实现某些逻辑. 总体说来 Mybatis 动态 SQL 语句主要有以下几类:if 语句 (简单的条件判断)choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
上一篇文章里已经讲到了 Mybatis与 Spring MVC 的集成,并且做了一个列表展示,显示出所有 article 列表,但没有用到分页,在实际的项目中,分页是肯定需要的。而且是物理分页,不是内存分页。对于物理分页方案,不同的数据库,有不同的实现方法,对于 Mysql 来说 就是利用 limit offset,pagesize 方式来实现的。
前面几篇文章已经讲到了 Mybatis 与 Mpring 的集成。但这个时候,所有的工程还不是 Web 工程,虽然我一直是创建的 Web 工程。今天将直接用 Mybatis与Spring mvc 的方式集成起来,源码在本文结尾处下载。主要有以下几个方面的配置:web.xml 配置 spring dispatchservlet ,比如为:mvc-dispatchermvc-dispatcher-servlet.xml 文件配置spring applicationContext.
在这一系列文章中,前面讲到纯粹用 Mybatis 连接数据库,然后 进行增删改查,以及多表联合查询的的例子,但实际项目中,通常会用 Spring 这个沾合剂来管理 datasource 等。充分利用 Spring 基于接口的编程,以及aop ,ioc 带来的方便。用 Spring 来管理 Mybatis 与管理 Hibernate 有很多类似的地方。今天的重点就是数据源管理以及 bean 的配置。
有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个 Article 这个表,并初始化数据。Drop TABLE IF EXISTS `article`;
前面已经讲到用接口的方式编程。这种方式,要注意的一个地方就是。在 User.xml 的配置文件中,mapper namespace="com.yihaomen.mybatis.inter.IUserOperation" ,命名空间非常重要,不能有错,必须与我们定义的 package 和 接口一致。
前面一章,已经搭建好了 Eclipse,Mybatis,MySql 的环境,并且实现了一个简单的查询。请注意,这种方式是用 SqlSession 实例来直接执行已映射的SQL语句:session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID", 1)其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如 IUserOperation.
Mybatis 的开发环境搭建,选择: Eclipse J2EE 版本,MySql 5.1 ,JDK 1.7,Mybatis3.2.0.jar包。这些软件工具均可以到各自的官方网站上下载。首先建立一个名字为 MyBaits 的 dynamic web project现阶段,你可以直接建立 java 工程,但一般都是开发 Web 项目,这个系列教程最后也是 Web 的,所以一开始就建立 Web 工程。将 Mybatis-3.2.0-SNAPSHOT.
什么是 Mybatis?MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
关注时代Java