`
cyril0513
  • 浏览: 16007 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

<<java并发编程实践>>之复合操作加锁策略

阅读更多
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章

    ### Java并发编程实践-电子书-03章:使用JDK并发包构建程序 #### 3.1 java.util.concurrent概述 在JDK5.0之后,Java引入了一系列高级并发特性,其中多数特性集中于`java.util.concurrent`包内,旨在为多线程并发...

    java并发个人心得

    根据提供的标题、描述以及部分上下文内容,我们尝试从中提炼出与Java并发相关的知识...以上是关于Java并发编程的一些基本知识点和个人经验分享。在实际开发中,理解并运用这些概念将有助于构建高性能且可靠的并发应用。

    Java并发教程.md

    ### Java并发教程知识点详解 #### 一、并发与同步机制 **并发**是现代软件开发中的核心概念之一,尤其在多核...以上知识点总结了Java并发编程的核心概念和技术细节,对于理解和设计高效可靠的并发应用至关重要。

    78页超全阿里巴巴编码规范考题分析(78页试题).doc

    这份78页的试题涵盖了多个编程实践和最佳实践,主要针对Java开发者,但也包含了一些数据库和多线程的相关知识。 **变量命名规范**: 1. 变量命名应清晰、简洁,避免使用容易引起误解的缩写。 2. 遵循驼峰命名法,如...

    oracle10g概念手册中英对照版

    - **Java集成:** Oracle支持Java编程语言的应用程序开发,包括存储过程和触发器的编写。 **4.2 应用程序开发语言概述** - **Oracle支持的语言:** 除了SQL和PL/SQL外,还支持C、C++等编程语言。 **4.3 原生数据...

Global site tag (gtag.js) - Google Analytics