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

数据库中的某一条记录或者是某一个对象中的字段,可以修改,也可以读取,一般情况下,读取的那个方法应该加锁(即用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中线程的锁和数据库中的事务隔离级别的更多相关文章

  1. MySQL数据库引擎、事务隔离级别、锁

    MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能 ...

  2. 互联网项目中mysql推荐(读已提交RC)的事务隔离级别

    [原创]互联网项目中mysql应该选什么事务隔离级别 Mysql为什么不和Oracle一样使用RC,而用RR 使用RC的原因 这个是有历史原因的,当然要从我们的主从复制开始讲起了!主从复制,是基于什么 ...

  3. 数据库常用的事务隔离级别和原理?&&mysql-Innodb事务隔离级别-repeatable read详解

    转载地址:https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc https://blog.csd ...

  4. [MySQL]理解关系型数据库4个事务隔离级别

    概述 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. 1. Read Uncommi ...

  5. Java面试题之Oracle 支持哪三种事务隔离级别

    Oracle 支持三种事务隔离级别: 1.读已提交:(默认) 2.串行化: 3.只读模式

  6. [Spring] Spirng中的AOP进行事务的传播属性和事务隔离级别

    通知注解 前置通知(@Before):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常) 返回后通知(@AfterReturning):在某连接点 ...

  7. Mysql事务隔离级别和锁机制

    一.Spring支持四种事务隔离级别: 1.ISOLATION_READ_UNCOMMITTED(读未提交):这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据. 2.ISOLAT ...

  8. SQL锁机制和事务隔离级别

    摘自:http://www.cnblogs.com/haiyang1985/archive/2009/02/27/1399641.html 锁机制 NOLOCK和READPAST的区别. 1.     ...

  9. MySQL事务及事务隔离级别 锁机制

    什么是事务? 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态更改为另一个一致性状态,这样的操作过程就是事务.事务具有的AC ...

随机推荐

  1. HTML5自定义属性对象Dataset简介

    一.html5 自定义属性介绍 我之前翻译的“你必须知道的28个HTML5特征.窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设 ...

  2. Mybatis 学习-3

    1.设计Dao接口 public interface UserDao { public boolean addUser(User user); } public interface CategoryD ...

  3. python中cPickle的用法

    import cPickle as p f = file('data.txt' , 'w') data = (1 , 'A' , "hello") p.dump(data , f) ...

  4. HDUOJ-------2719The Seven Percent Solution

    The Seven Percent Solution Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  5. 多条查询sql语句返回多表数据集

    + + "';SELECT ProductID,ProductTitle,ProductName,SalePrice,ListingPrice,MainPicture,SaledItemCo ...

  6. MASM6.15汇编程序例子

    /***************通过调用(INT 21H)表中的01h号功能号从键盘输入一个字符并回显到视频显示器上*****************/ DATAS SEGMENT ;此处输入数据段代 ...

  7. 用jquery或js实现三个div自动循环轮播

    //3个div的统一class = 'div' var index =0; //3秒轮播一次 var timer = setInterval(function(){     index = (inde ...

  8. Can't connect to local MySQL server through socket 问题解决

    Fedora8启动mysql 报错:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/m ...

  9. Eclipse导出可执行Jar文件(包含第三方Jar包)

    1. 首先,右键你的Java工程,选择Export,在Java文件夹下选择Runnable JAR file,如下图所示: 2. 选择Runnable JAR file后,会弹出如下所示的对话框,选择 ...

  10. cf卡中,wtmp文件较大,导致磁盘空间满了

    看了一下,有一个wtmp 和wtmp.1的文件非常大.wtmp记录的是机器注销.启动的信息.由此可见,机器长时间的不断重启,造成该日志记录超级大,把cf的空间给占满了. wtmp日志可以用who和la ...