`

jdk1.5的线程锁技术

阅读更多
/**
 * LockTest.java
 * cn.com.songjy.test.socket.thread
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-8-169    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
 */

package cn.com.songjy.test.socket.thread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:LockTest
 * java5的线程锁技术
 * 
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-8-19 上午10:22:22
 */

public class LockTest {

	private static Log log = LogFactory.getLog(TraditionalThread.class);

	public static void main(String[] args) {
		new LockTest().init();
	}

	private void init() {

		final OutPuter outPuter = new OutPuter();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
					outPuter.output("1111111111111111111111111111");
				}
			}
		}).start();
		
		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
					outPuter.output("2222222222222222222222222222");
				}
			}
		}).start();
	}

	static class OutPuter {
		
		Lock lock = new ReentrantLock();
		
		public void output(String name) {// 一个一个打印字符串中的字符到控制台,重新组成完整的字符串,若不完整,说明没有同步,线程不安全
			int len = name.length();
			/*synchronized (this) {
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
			}*/
			
			//以下代码与上述注释掉的代码效果一样,但大并发时效率上可能差了一点
			lock.lock();
			try {
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
			} catch (Exception e) {
				log.error(e.getMessage(), e);
			} finally {
				lock.unlock();//即使程序错误也要确保锁的释放(不要占着茅坑不拉屎,那怕晕倒在茅坑!(*^__^*) 嘻嘻)
			}
		}
	}
}


来自:http://down.51cto.com/data/443430
  • 大小: 209.3 KB
分享到:
评论

相关推荐

    经典Java多线程与并发库高级应用

    除了上述提到的技术点,本教程还会涉及到ThreadLocal类、线程范围内共享变量、多个线程之间共享数据的方式、java5原子性操作类的应用、Callable与Future的应用、线程锁技术、读写锁技术等内容。这些技术点都旨在帮助...

    Multi person chat_jdk1.8_java编程_

    3. **使用ExecutorService和Callable接口**:JDK 1.5引入的Executor框架允许更高级别的线程管理。Callable接口与Runnable类似,但可以返回结果。使用ExecutorService可以创建线程池,有效管理线程生命周期,提高性能...

    黑马程序员-java多线程技术01

    2. **Lock接口**:JDK 1.5引入了Lock接口,它提供了比synchronized更细粒度的控制,如可重入性、公平性、非阻塞尝试获取锁等功能。ReentrantLock是Lock接口的一个实现,它的使用方式如下: ```java Lock lock = new...

    Java高并发实战,锁的优化.docx

    例如,String对象的拼接操作在JDK 1.5之前会被优化为使用StringBuffer,但每次append操作都有同步块,JVM会检测到这种情况并进行锁消退,使得连续的append操作只需加锁一次。 锁粗化则是针对频繁对同一对象进行加锁...

    涵盖了90%以上的面试题

    3. **ConcurrentHashMap**: ConcurrentHashMap 提供了线程安全且高效的解决方案,它通过锁分段技术,将数据分成多个段,每个段由独立的锁保护,允许并发访问。 4. **ArrayList 和 LinkedList**: 在尾部添加元素,...

    黑马面试题总结

    以上总结了IT面试中常见的知识点,涵盖了进程与线程状态、输入输出流、集合框架、Java内存模型、多态、JDK 1.5新特性、设计模式、Java中的锁机制、JVM基础知识以及异常处理等多个方面。通过掌握这些核心概念和技术,...

    每日练习:Java中的线程之线程间的通信教程.doc

    在JDK1.5引入的ReentrantLock(可重入互斥锁)提供了更强大的线程同步功能。ReentrantLock不仅具备synchronized的互斥性,还支持条件条件(Condition),通过newCondition()可以创建多个条件,每个条件对应一组等待...

    Java问题定位技术.pdf

    还特别提醒了JDK1.5线程池和Timer使用的陷阱。 最后,文档还提供了有关JVM运行期参数、扩展运行参数、JIT优化、虚拟机剖析接口以及字符集和编码的知识点。字符集和编码是Java应用中处理国际化和本地化问题时不可...

    多线程问题

    例如,在JDK 1.5中引入了新的并发API,并在后续版本中持续改进和优化了这些并发工具,使得Java并发编程变得更加简便和安全。 总之,Java多线程编程极大地增强了程序处理并发任务的能力,但是在享受多线程带来的好处...

    面试必备之乐观锁与悲观锁.pdf

    在数据库和并发编程领域,锁是一种用来同步多个线程对共享资源访问的技术。其中,乐观锁与悲观锁是两种常见的锁机制,它们在处理并发时有着不同的策略和适用场景。 悲观锁(Pessimistic Locking)是一种保守的锁策略...

    线程面试题

    - `Callable`接口是在JDK 1.5中引入的,相比`Runnable`接口提供了更强大的功能。 7. **CyclicBarrier和CountDownLatch的区别?** - `CyclicBarrier`和`CountDownLatch`都是用来同步一组线程的工具类,但它们的...

    Android多线程全新讲解.pdf

    JDK 1.5引入了更多的同步工具类,如线程池`ExecutorService`,它允许更有效地管理线程,避免频繁创建和销毁线程带来的开销。`Callable`和`Future`接口提供了获取线程执行结果的能力,而`Future`的`get()`方法可以...

    JAVA2核心技术(中文的PDF).part3.rar

    全面覆盖Java 2技术的高级主题,包括:多线程、集合框架、网络API、数据库编程、分布式对象等,深入探究了Swing、Java 2D API、JavaBean、Java安全模式、XML、注释、元数据等主题,同时涉及本地方法、国际化以及JDK ...

    JAVA多线程编程详解-详细操作例子

    5. **线程池**:从 JDK 1.5 开始,Java 引入了 `ExecutorService` 和 `ThreadPoolExecutor`,允许开发者创建线程池来管理线程。线程池可以有效控制运行的线程数量,避免频繁创建和销毁线程带来的开销,提高系统性能...

    java 多线程实例

    - **start()方法的实现**:在JDK 1.5及之后的版本中,`start()`方法的实现有所变化。它不再是一个本地方法,而是包含了一个本地方法`start0()`的调用。此外,`start()`方法还会检查一个标志位`started`,确保线程只...

    java并发笔记

    - **JDK1.5**: 这一版本是Java并发发展历程中的里程碑。它引入了自动装箱、泛型、动态注解、枚举、可变长参数、增强for循环等功能,更重要的是,它改进了Java内存模型(JMM)并提供了`java.util.concurrent`并发包的...

    Java多线程编程详解

    尽管这些方法在JDK 1.5之后已被弃用,但仍然值得了解。`Thread.suspend()`和`Thread.resume()`方法可以配合使用来控制线程的执行。`suspend()`方法会使线程停止执行,而`resume()`方法会恢复该线程的执行。这两个...

Global site tag (gtag.js) - Google Analytics