zoukankan      html  css  js  c++  java
  • Java中线程的锁和数据库中的事务隔离级别

    当涉及到两个或多个线程操作同一个资源时,就会出现锁的问题。

    数据库中的某一条记录或者是某一个对象中的字段,可以修改,也可以读取,一般情况下,读取的那个方法应该加锁(即用synchronized互斥),而读取的那个方法则不需要加锁。允许多个线程同时读取,而不允许同时进行修改。对应的数据库事务隔离级别应该是:read committed,即可以避免读取到脏数据,但是不可重复读。

    关于事务的隔离级别,感觉这篇文章介绍的不错:

    http://www.linuxidc.com/Linux/2013-06/85339.htm

    事务的隔离级别:        可能产生的问题

    read uncommited    脏读

    read committed     不可重复读取

    read repeatedly           幻读(insert)

    serialization

    其中Serializable中读不是在读的行上加锁,而是在整个表上加锁,阻止对该表任何行的写。

    以下代码示例,多个线程(主线程和线程tt)对同一个资源b的修改和读取操作:

    package testthread;

    /**
    * 測試读个线程访问同一个资源
    * @author Administrator
    *
    */
    public class TestSynchronized2 implements Runnable {
    int b = 100;

    /**
    * 修改数据的方法需要加互斥锁
    */
    public synchronized void m1() {
    try {
    Thread.sleep(5000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    b = 1000;

    System.out.println("b = " + b);
    }

    /**
    * 读取数据的方法可以不用加互斥锁
    */
    public void m2() {
    System.out.println(b);
    }

    public void run() {
    m1();
    }

    public static void main(String[] args) {
    TestSynchronized2 tt = new TestSynchronized2();
    new Thread(tt).start();

    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    //调用tt.m2();是方法调用,所有必须先执行完m2方法,才会执行打印语句
    //虽然不是单独线程执行的m2方法,但是要注意m2是不是同步方法
    tt.m2();
    System.out.println("tt.b:" + tt.b);
    }
    }

  • 相关阅读:
    java操作生成jar包 和写入jar包
    jboss配置jndi连接池
    windows 域的LDAP查询相关举例
    LDAP error Code 及解决方法
    HDU 6417
    CF1299D Around the World
    codechef Chef and The Colored Grid
    Educational Codeforces Round 82 (Rated for Div. 2)
    CF1237F Balanced Domino Placements
    CF1254E Send Tree to Charlie
  • 原文地址:https://www.cnblogs.com/wenwujuncheng/p/3383046.html
Copyright © 2011-2022 走看看