public class UnSafeOperation {
//直接使用this加锁
public synchronized String get(Vector<String> vector) {
if (vector.isEmpty()) {
return null;
}
int index = vector.size() - 1;
return vector.get(index);
}
//对vector加锁
public String get1(Vector<String> vector) {
synchronized (vector) {
if (vector.isEmpty()) {
return null;
}
int index = vector.size() - 1;
return vector.get(index);
}
}
public synchronized void delete(Vector<String> vector) {
int index = vector.size() - 1;
vector.remove(index);
}
public synchronized void delete1(Vector<String> vector) {
synchronized (vector) {
int index = vector.size() - 1;
vector.remove(index);
}
}
public static void main(String[] args) {
final Vector<String> vector = new Vector<String>();
vector.add("chneliang");
final UnSafeOperation unSafe = new UnSafeOperation();
new Thread() {
public void run() {
unSafe.get(vector);
}
}.start();
unSafe.delete(vector);
}
}
实现对Vector的修改,如果不使用加锁控制,这样的复合操作,会导致发生错误。但是如果加锁,是直接像get()方法这样,还是对修改的对象加锁,其实很明显,如果我们直接对this加锁,会导致该类中的其他同步方法受到阻塞,锁的粒度太大,如果我们仅仅只是对要修改的对象加锁,就不会有这样的问题。
初次学习并发,发现涉及锁的策略,也并不是那么简单的直接用一个synchronized关键字就能搞定的。
分享到:
相关推荐
### Java并发编程实践-电子书-03章:使用JDK并发包构建程序 #### 3.1 java.util.concurrent概述 在JDK5.0之后,Java引入了一系列高级并发特性,其中多数特性集中于`java.util.concurrent`包内,旨在为多线程并发...
根据提供的标题、描述以及部分上下文内容,我们尝试从中提炼出与Java并发相关的知识...以上是关于Java并发编程的一些基本知识点和个人经验分享。在实际开发中,理解并运用这些概念将有助于构建高性能且可靠的并发应用。
### Java并发教程知识点详解 #### 一、并发与同步机制 **并发**是现代软件开发中的核心概念之一,尤其在多核...以上知识点总结了Java并发编程的核心概念和技术细节,对于理解和设计高效可靠的并发应用至关重要。
这份78页的试题涵盖了多个编程实践和最佳实践,主要针对Java开发者,但也包含了一些数据库和多线程的相关知识。 **变量命名规范**: 1. 变量命名应清晰、简洁,避免使用容易引起误解的缩写。 2. 遵循驼峰命名法,如...
- **Java集成:** Oracle支持Java编程语言的应用程序开发,包括存储过程和触发器的编写。 **4.2 应用程序开发语言概述** - **Oracle支持的语言:** 除了SQL和PL/SQL外,还支持C、C++等编程语言。 **4.3 原生数据...