先看个代码吧!
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修饰的代码块差不多!
大家把例子运行下就能看出来差别,如有不对的地方欢迎大家拍砖.
分享到:
相关推荐
(15分) 主要相同点: Lock能完成synchronized所实现的所有功能.(其它不重要) 主要不同点: Lock有比synchronized更精确的线程语义和更好的性能(在相同点中回答此点也行) synchronized会自动释放锁....
### 浅谈Java的多线程机制 #### 一、引言 随着计算机技术的不断发展,编程模型变得越来越复杂和多样化。多线程编程模型作为目前计算机系统架构中的一个重要组成部分,其重要性日益凸显。特别是在X86架构的硬件成为...
### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...
"浅谈Java并发编程之Lock锁和条件变量" Lock锁是Java并发编程中的一种重要机制,它提供了比synchronized更加广泛的锁定操作。Lock接口有三种实现类:ReentrantLock、ReetrantReadWriteLock.ReadLock和...
6. Lock接口和ReentrantLock类:提供了比synchronized更精细的锁控制,如可中断的等待、公平锁等。ReentrantLock是Lock接口的一个实现,具有可重入性,即一个线程可以进入已经由该线程持有的锁。 7. ThreadLocal:...
#### synchronized关键字的作用及应用 在Java多线程环境中,`synchronized`关键字扮演着至关重要的角色。它可以帮助开发者确保多线程环境下的数据一致性,防止因并发访问导致的数据错误。本篇文章将深入探讨`...
- Java虚拟机(JVM)使用监视器锁(Monitor Lock)来实现`synchronized`的功能。 - 监视器锁由一个条件队列和一个计数器组成。当线程请求获取锁时,会检查监视器锁的状态;如果锁可用,线程可以获得锁并增加计数器的值...
在iOS开发中,多线程技术常常用于提升应用程序的响应速度和用户体验,但在并发执行时,资源竞争问题可能会导致数据不一致或者程序错误。为了解决这个问题,我们需要确保线程安全,即在同一时刻只有一个线程能访问...
浅谈Java多线程实现及同步互斥通讯 多线程实现方式: Java中的多线程实现方式共有两种:通过继承Thread类和通过实现Runnable接口。下面我们来详细了解这两种方式: 1. 通过继承Thread类来实现多线程: 通过继承...
《AtomicInteger 浅谈》 在Java编程中,原子性操作是并发编程中非常关键的一环,它确保了在多线程环境下数据的正确性和一致性。AtomicInteger是Java并发包java.util.concurrent.atomic中的一个类,提供了对单个整型...
- **4.8 Synchronized和Lock的区别和用法**:比较同步关键字`synchronized`与显式锁`Lock`的优缺点及使用场景。 - **4.9 Final、Finally、Finalize的区别**:分析这三个关键字的意义及其在Java中的应用。 - **...
3. **多线程与并发**:线程安全、同步机制(synchronized、volatile、Lock)、线程池(ExecutorService)和并发工具类(ConcurrentHashMap、CountDownLatch、CyclicBarrier、Semaphore)是重点。 4. **设计模式**:...
5. **多线程**:Java提供了对多线程的支持,面试中会涉及线程的创建、同步机制(synchronized、Lock)、并发工具类(如Semaphore、CountDownLatch)以及线程池(ExecutorService)的使用。 6. **IO流与NIO**:了解...
你的设计应该对手头的问题有针对性,同时对将来的问题和需求 也要有足够的通用性。 你也希望避免重复设计或尽可能少做重复设计。有经验的面向对象设计者会告诉你,要一下子就得到复用性和灵活性好的设计, 即使不是...
理解并发控制机制,如`synchronized`、`volatile`、`Lock`接口及其实现类,是必备技能。 **项目经验和问题穿插** 在第二阶段,面试官会关注你的实际项目经验,这不仅包括项目的技术栈,还包括你在项目中遇到的问题...
本文主要讨论了一个在处理Boolean常量时可能遇到的同步问题。在Java中,`synchronized`关键字用于控制并发访问,保证同一时刻只有一个线程能够执行特定的代码块,以防止数据的不一致性。 首先,我们要理解Java中的...
但是 HashMap 原有的问题也都存在,比如在并发场景下使用时容易出现死循环。 final HashMap, String> map = new HashMap, String>(); for (int i = 0; i ; i++) { new Thread(new Runnable() { @Override public...
接着,面试中常问的问题可能涉及线程同步和通信机制,如synchronized关键字、wait/notify机制、volatile关键字以及Lock接口。synchronized用于控制多线程对共享资源的访问,确保线程安全;wait/notify是Object类中的...
在Java多线程部分,文档讲解了synchronized关键字和Lock的区别及其用法,同时提及了并发编程中常见的几个问题,例如线程安全、死锁等。 #### Java面试高频问题 根据作者个人的面试经历,文中还列举了诸如Spring...
- Synchronized和Lock的区别和用法:理解同步关键字synchronized和锁接口Lock的不同用法和优势。 - Final、Finally、Finalize的区别:掌握这三个关键字的用途和区别。 - OverLoad与Override的区别:明确方法重载...