`
wangshiyang
  • 浏览: 69791 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

老谈synchronized,lock的区别及问题.

阅读更多
先看个代码吧!
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TestThread {
	public static long t=0;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成方法存根
		
		TestThread2 tt = new TestThread2();
		System.out.println(t=System.currentTimeMillis());
		new Thread(tt).start();
		new Thread(tt).start();
		new Thread(tt).start();
		new Thread(tt).start();
		new Thread(tt).start();
		
	}
}

class TxtThread implements Runnable {
	int num = 100;
	String str = new String();

	public void run() {
		while (num > 0) {
			synchronized (str) {
				if (num > 0) {
					try {
						Thread.sleep(1000);
					} catch (Exception e) {
						e.getMessage();
					}
					System.out.println(Thread.currentThread().getName()
							+ "this is " + num--);
				}
			}
		}
	}
}

class TestThread2 implements Runnable {
	int num = 100;
	String str = new String();

	@Override
	public void run() {
		Lock lock=new ReentrantLock();
		while (num > 0) {
			lock.lock();
			try {
				boolean b=lock.tryLock(100,TimeUnit.MILLISECONDS);
				if (num > 0) {
					Thread.sleep(100);
				}
				if(num==0){
					return;
				}
				System.out.println(Thread.currentThread().getName()
						+ "this is " + num--);
			} catch (Exception e) {
				e.getMessage();
			}finally{
			lock.unlock();
			}
		}
		System.out.println("cost time is: "+(System.currentTimeMillis()-TestThread.t));
	}

}


synchronized的执行方式是:谁获得了锁,谁就执行,其他的线程都会处于等待状态,等当前线程执行完之后,根据系统的线程调用规则来调用数据.可以这样说吧,synchronized比较死板,不灵活,所以就要使用Lock锁来进行同步了!   上面的例子不是太清晰,再发个
package com.virusyang.tools;

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

public class ThreadTest2 {

	/**
	 * @param args
	 */
	private static long c = 0;

	public static void main(String[] args) {
		final Lock l = new ReentrantLock();
		Thread t1 = new Thread() {
			public void run() {
				for (int i = 0; i < 10;) {
					try {
						if (l.tryLock()) {
							c++;
							i++;
							
							System.out.println(Thread.currentThread().getName()
									+ " t1 this is " +c);
							l.unlock();
						}
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		Thread t2 = new Thread() {
			public void run() {
				for (int i = 0; i < 10;) {
					
						try {
							if (l.tryLock(250,TimeUnit.MILLISECONDS)) {
								c++;
								i++;
								System.out.println(Thread.currentThread().getName()
										+ " t2 this is " +c);
								l.unlock();
							}
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					
				}
			}
		};
		long t = System.currentTimeMillis();
		Thread t3 = new Thread() {
			public void run() {
				for (int i = 0; i < 10;) {
					try {
						if (l.tryLock()) {
							c++;
							i++;
							
							System.out.println(Thread.currentThread().getName()
									+ " t3 this is " +c);
							l.unlock();
						}
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		
		Thread t4 = new Thread() {
			public void run() {
				for (int i = 0; i < 10;) {
					try {
						if (l.tryLock()) {
							c++;
							i++;
							
							System.out.println(Thread.currentThread().getName()
									+ " t4 this is " +c);
							l.unlock();
						}
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		
		
		t2.start();
		t1.start();
		t3.start();
		t4.start();
		
	}

}
这个例子执行的时候,分为lock(),trylock(),trylock(arg,arg)三种方法,其中使用第三种方法的时候线程的执行是独占的,trylock()是在系统空闲时就申请,不会等待,没有第三种方法灵活,lock()则和synchronized修饰的代码块差不多!

大家把例子运行下就能看出来差别,如有不对的地方欢迎大家拍砖.
分享到:
评论

相关推荐

    Java学习题答案

    (15分) 主要相同点: Lock能完成synchronized所实现的所有功能.(其它不重要) 主要不同点: Lock有比synchronized更精确的线程语义和更好的性能(在相同点中回答此点也行) synchronized会自动释放锁....

    浅谈Java的多线程机制.pdf

    ### 浅谈Java的多线程机制 #### 一、引言 随着计算机技术的不断发展,编程模型变得越来越复杂和多样化。多线程编程模型作为目前计算机系统架构中的一个重要组成部分,其重要性日益凸显。特别是在X86架构的硬件成为...

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    ### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...

    浅谈Java并发编程之Lock锁和条件变量

    "浅谈Java并发编程之Lock锁和条件变量" Lock锁是Java并发编程中的一种重要机制,它提供了比synchronized更加广泛的锁定操作。Lock接口有三种实现类:ReentrantLock、ReetrantReadWriteLock.ReadLock和...

    浅谈JAVA中多线程的实现.zip

    6. Lock接口和ReentrantLock类:提供了比synchronized更精细的锁控制,如可中断的等待、公平锁等。ReentrantLock是Lock接口的一个实现,具有可重入性,即一个线程可以进入已经由该线程持有的锁。 7. ThreadLocal:...

    Java同步机制浅谈

    #### synchronized关键字的作用及应用 在Java多线程环境中,`synchronized`关键字扮演着至关重要的角色。它可以帮助开发者确保多线程环境下的数据一致性,防止因并发访问导致的数据错误。本篇文章将深入探讨`...

    谈面试时从写一个单例开始究竟能问多深及终极解决方案.docx

    - Java虚拟机(JVM)使用监视器锁(Monitor Lock)来实现`synchronized`的功能。 - 监视器锁由一个条件队列和一个计数器组成。当线程请求获取锁时,会检查监视器锁的状态;如果锁可用,线程可以获得锁并增加计数器的值...

    浅谈iOS中的锁的介绍及使用

    在iOS开发中,多线程技术常常用于提升应用程序的响应速度和用户体验,但在并发执行时,资源竞争问题可能会导致数据不一致或者程序错误。为了解决这个问题,我们需要确保线程安全,即在同一时刻只有一个线程能访问...

    浅谈Java多线程实现及同步互斥通讯

    浅谈Java多线程实现及同步互斥通讯 多线程实现方式: Java中的多线程实现方式共有两种:通过继承Thread类和通过实现Runnable接口。下面我们来详细了解这两种方式: 1. 通过继承Thread类来实现多线程: 通过继承...

    AtomicInteger 浅谈

    《AtomicInteger 浅谈》 在Java编程中,原子性操作是并发编程中非常关键的一环,它确保了在多线程环境下数据的正确性和一致性。AtomicInteger是Java并发包java.util.concurrent.atomic中的一个类,提供了对单个整型...

    Java面试指南.pdf

    - **4.8 Synchronized和Lock的区别和用法**:比较同步关键字`synchronized`与显式锁`Lock`的优缺点及使用场景。 - **4.9 Final、Finally、Finalize的区别**:分析这三个关键字的意义及其在Java中的应用。 - **...

    Java高级开发工程师面试笔记.zip

    3. **多线程与并发**:线程安全、同步机制(synchronized、volatile、Lock)、线程池(ExecutorService)和并发工具类(ConcurrentHashMap、CountDownLatch、CyclicBarrier、Semaphore)是重点。 4. **设计模式**:...

    java软件工程师面试常见问题

    5. **多线程**:Java提供了对多线程的支持,面试中会涉及线程的创建、同步机制(synchronized、Lock)、并发工具类(如Semaphore、CountDownLatch)以及线程池(ExecutorService)的使用。 6. **IO流与NIO**:了解...

    二十三种设计模式【PDF版】

    你的设计应该对手头的问题有针对性,同时对将来的问题和需求 也要有足够的通用性。 你也希望避免重复设计或尽可能少做重复设计。有经验的面向对象设计者会告诉你,要一下子就得到复用性和灵活性好的设计, 即使不是...

    如何准备阿里社招面试,顺谈 Java 程序员学习中各阶段的建议1

    理解并发控制机制,如`synchronized`、`volatile`、`Lock`接口及其实现类,是必备技能。 **项目经验和问题穿插** 在第二阶段,面试官会关注你的实际项目经验,这不仅包括项目的技术栈,还包括你在项目中遇到的问题...

    浅谈Java多线程编程中Boolean常量的同步问题

    本文主要讨论了一个在处理Boolean常量时可能遇到的同步问题。在Java中,`synchronized`关键字用于控制并发访问,保证同一时刻只有一个线程能够执行特定的代码块,以防止数据的不一致性。 首先,我们要理解Java中的...

    sesvc.exe 阿萨德

    但是 HashMap 原有的问题也都存在,比如在并发场景下使用时容易出现死循环。 final HashMap, String&gt; map = new HashMap, String&gt;(); for (int i = 0; i ; i++) { new Thread(new Runnable() { @Override public...

    多线程面试59题(含答案)_.zip

    接着,面试中常问的问题可能涉及线程同步和通信机制,如synchronized关键字、wait/notify机制、volatile关键字以及Lock接口。synchronized用于控制多线程对共享资源的访问,确保线程安全;wait/notify是Object类中的...

    Java面试指南_JAVA.pdf

    在Java多线程部分,文档讲解了synchronized关键字和Lock的区别及其用法,同时提及了并发编程中常见的几个问题,例如线程安全、死锁等。 #### Java面试高频问题 根据作者个人的面试经历,文中还列举了诸如Spring...

    面试指南java

    - Synchronized和Lock的区别和用法:理解同步关键字synchronized和锁接口Lock的不同用法和优势。 - Final、Finally、Finalize的区别:掌握这三个关键字的用途和区别。 - OverLoad与Override的区别:明确方法重载...

Global site tag (gtag.js) - Google Analytics