java lock_java lock讲解与用法

< type="text/catch 加以保护,以确保在必要时释放锁。

Lock 实现提供了使用 synchronized 方法和语句所没有的其他功能,包括提供了一个非块结构的获取锁尝试 (tryLock())、一个获取可中断锁的尝试 (lockInterruptibly()) 和一个获取超时失效锁的尝试 (tryLock(long, TimeUnit))。

Lock 类还可以提供与隐式监视器锁完全不同的行为和语义,如保证排序、非重入用法或死锁检测。如果某个实现提供了这样特殊的语义,则该实现必须对这些语义加以记录。

注意,Lock 实例只是普通的对象,其本身可以在 synchronized 语句中作为目标使用。获取 Lock 实例的监视器锁与调用该实例的任何 lock() 方法没有特别的关系。为了避免混淆,建议除了在其自身的实现中之外,决不要以这种方式使用 Lock 实例。

除非另有说明,否则为任何参数传递 null 值都将导致抛出 NullPointerException。

内存同步

所有 Lock 实现都必须 实施与内置监视器锁提供的相同内存同步语义,如 The Java Language Specification, Third Edition (17.4 Memory Model) 中所描述的:

成功的 lock 操作与成功的 Lock 操作具有同样的内存同步效应。

成功的 unlock 操作与成功的 Unlock 操作具有同样的内存同步效应。

不成功的锁定与取消锁定操作以及重入锁定/取消锁定操作都不需要任何内存同步效果。

实现注意事项

三种形式的锁获取(可中断、不可中断和定时)在其性能特征、排序保证或其他实现质量上可能会有所不同。而且,对于给定的 Lock 类,可能没有中断正在进行的 锁获取的能力。因此,并不要求实现为所有三种形式的锁获取定义相同的保证或语义,也不要求其支持中断正在进行的锁获取。实现必需清楚地对每个锁定方法所提供的语义和保证进行记录。还必须遵守此接口中定义的中断语义,以便为锁获取中断提供支持:完全支持中断,或仅在进入方法时支持中断。

由于中断通常意味着取消,而通常又很少进行中断检查,因此,相对于普通方法返回而言,实现可能更喜欢响应某个中断。即使出现在另一个操作后的中断可能会释放线程锁时也是如此。实现应记录此行为

File: Professor.java

import javax.persistence.CascadeType;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.ManyToOne;

import javax.persistence.Version;

@Entity

public class Professor {

@Id private int id;

private String name;

private long salary;

private int vacationDays;

@Version private int version;

@ManyToOne(cascade={CascadeType.REFRESH})

private Professor manager;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public long getSalary() {

return salary;

}

public void setSalary(long salary) {

this.salary = salary;

}

public int getVacationDays() {

return vacationDays;

}

public void setVacationDays(int vacation) {

this.vacationDays = vacation;

}

public Professor getManager() {

return manager;

}

public void setManager(Professor manager) {

this.manager = manager;

}

public String toString() {

return "Professor id: " getId() " name: " getName()

" vacation: " getVacationDays() " salary: " getSalary();

}

}

File: ProfessorService.java

import javax.persistence.EntityManager;

import javax.persistence.LockModeType;

import javax.persistence.Query;

public class ProfessorService {

protected EntityManager em;

public ProfessorService(EntityManager em) {

this.em = em;

}

public void lockAllProfessors() {

Query query = em.createQuery("SELECT e FROM Professor e");

for(Object employee: query.getResultList()){

em.lock(employee, LockModeType.WRITE);

}

}

}

File: JPAUtil.java

import java.io.Reader;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.Statement;

public class JPAUtil {

Statement st;

public JPAUtil() throws Exception{

Class.forName("org.hsqldb.jdbcDriver");

System.out.println("Driver Loaded.");

String url = "jdbc:hsqldb:data/tutorial";

Connection conn = DriverManager.getConnection(url, "sa", "");

System.out.println("Got Connection.");

st = conn.createStatement();

}

public void executeSQLCommand(String sql) throws Exception {

st.executeUpdate(sql);

}

public void checkData(String sql) throws Exception {

ResultSet rs = st.executeQuery(sql);

ResultSetMetaData metadata = rs.getMetaData();

for (int i = 0; i < metadata.getColumnCount(); i ) {

System.out.print("t" metadata.getColumnLabel(i 1));

}

System.out.println("n----------------------------------");

while (rs.next()) {

for (int i = 0; i < metadata.getColumnCount(); i ) {

Object value = rs.getObject(i 1);

if (value == null) {

System.out.print("t       ");

} else {

System.out.print("t" value.toString().trim());

}

}

System.out.println("");

}

}

}

File: Main.java

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

public class Main {

public static void main(String[] a) throws Exception {

JPAUtil util = new JPAUtil();

EntityManagerFactory emf = Persistence.createEntityManagerFactory("ProfessorService");

EntityManager em = emf.createEntityManager();

ProfessorService service = new ProfessorService(em);

em.getTransaction().begin();

service.lockAllProfessors();

util.checkData("select * from Professor");

em.getTransaction().commit();

em.close();

emf.close();

}

}

File: persistence.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence" version="1.0">

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值