今天被问到read需不需要加锁,结果没答上来。自己写了一个程序试了一下,答案是肯定的,read加锁是为了保证执行的顺序,让线程不会读到脏数据。
public class TestThread {
private int a = 1;
public synchronized void add(){
this.a = this.a + 1;
System.out.println(Thread.currentThread().getName() + "current a is " + a);
}
public int get(){
System.out.println("current a is " + a);
return a;
}
public static void main(String[] args) throws Exception{
final TestThread testThread = new TestThread();
Thread t1 = new Thread(new Runnable(){
public void run(){
testThread.add();
//make sure the second thread to be executed at this moment
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
testThread.get();
}
}
);
Thread t2 = new Thread(new Runnable(){
public void run(){
//make sure the first thread to be started firstly at beginning
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
testThread.add();
testThread.get();
}
}
);
t1.start();
t2.start();
}
}
output:
Thread-0current a is 2
Thread-1current a is 3
current a is 3
current a is 3
如果对testThread.add();testThread.get();加锁就不会出现刚才读到脏数据的问题。
分享到:
相关推荐
### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...
在Java中,我们可以使用`synchronized`关键字进行加锁,而在C++中,可以利用互斥量(mutex)或者条件变量等工具。在Python中,有`threading.Lock`对象来实现锁定。 当一个线程获取了锁之后,其他试图访问同一锁的...
从JDK 5开始,Java采用了全新的内存模型,彻底放弃了旧模型中的主内存和工作内存的概念,同时也去除了原有的8种内存操作。新模型引入了“happens-before”原则,这是一个强大的工具,用来定义不同线程或操作之间的...
- 隔离级别包括READ_UNCOMMITTED(读未提交)、READ_COMMITTED(读已提交)、REPEATABLE_READ(可重复读)、SERIALIZABLE(串行化)。 - 事务传播机制定义了在一个事务中的方法如何嵌套调用另一个事务方法的行为。...
通常,`read()`方法用于从流中读取一个字节的数据,而`write()`方法则将一个字节的数据写入流中。 3. **高级流处理**:通过包装`DataInputStream`和`DataOutputStream`,可以更高效地处理基本数据类型如整型的读写...
4. **事务隔离级别**:Java可以通过设置`Connection.setTransactionIsolation()`调整事务隔离级别,如读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化...
Java内存模型是Java多线程编程中的核心概念,它规定了如何处理线程间的共享变量访问,以确保数据的一致性和正确性。本文主要探讨了Java内存模型从早期到JDK5之后的历史变迁。 在旧的Java内存模型中,线程通过共享...
为了实现这一点,JMM规定线程在解锁(unlock)前必须将共享变量的更新写回主内存,而在加锁(lock)前需要从主内存获取最新的变量值。 3. **原子性**:JMM确保某些操作(如读写变量)是不可分割的,即在其他线程...
有四种隔离级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。MySQL默认使用可重复读。 10. **可重复读解决的问题**: 可重复读解决了脏...
阿里Java面试题集锦主要涵盖了Java编程语言的基础与高级特性,以及在阿里巴巴这样的大型企业中常见的面试知识点。以下是对这些面试题的详细解读: 一、红黑树的特性: 红黑树是一种自平衡的二叉查找树,其特性包括...
- **JSP**:全称为Java Server Pages,也是一种Java技术,用于创建动态Web页面。JSP实际上是Servlet的一种特殊形式,它将HTML标记和Java代码混合在一起,编译为Servlet后执行。 - **区别**: - **Servlet**需要...
- **持久性**:一旦事务提交,即使系统崩溃,其结果也是永久的。 **2.2 事务的隔离级别** MySQL支持四种不同的事务隔离级别: - **读未提交(Read Uncommitted)**:最低级别的隔离,允许事务读取未提交的数据,...
20. **事务隔离级别的选择**:主要包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE四个级别。 21. **乐观锁与悲观锁**:乐观锁假设冲突较少,每次更新数据前检查版本号;悲观锁假设冲突较多...
Java简答题总结pdf文档 ...Hashtable保证线程安全的方式是通过给整张散列表加锁,ConcurrentHashMap保证线程安全的方式是采用分段锁机制(如果多线程并发访问的是不同段(segment)是完全并发的)。
`String`: 同样不正确,因为这些方法也不需要返回字符串。 - C. `void`: 正确答案,事件监听方法通常执行某些操作但不返回任何值。 - D. `Object`: 一般情况下也不会返回对象。 - E. `AWTEvent`: 这是事件本身的...
- **串行化(Serializable)**:最严格的隔离级别,通过加锁保证事务的顺序执行,防止所有并发问题,但性能较差。 3. **Java中处理事务的方式**: - **编程式事务管理**:通过编程方式手动管理事务,如使用`try-...
- **Read**:使用 `executeQuery` 执行 SELECT 语句。 - **Update**:使用 `executeUpdate` 执行 UPDATE 语句。 - **Delete**:使用 `executeUpdate` 执行 DELETE 语句。 **4.3 Statement 的缺点** - 不支持预编译 ...
1. **加锁**: 使用`synchronized`或`Lock`等加锁机制来保护临界区。 2. **原子操作**: 使用原子类如`AtomicInteger`来避免数据竞争。 3. **不变量**: 设计不变量来保证数据一致性。 ```java public class ...