JDK5.0 开始,有两种机制来保护代码块不受并行访问的干扰.从旧版本的java用的synchronized 关键字达到这个目的,而JDK5.0引进勒ReentrantLock类。在测试线程的并行访问时,不同线程中调用的是同一个加锁对象所在类的实例。不同的实例,会得到不同的锁对象,最终结果是互不干扰。
Synchronized 关键字:
java中两种使用synchronized的方式:同步代码块,同步方法.
synchronized(obj)表示若多个线程同时访问时,只让其中一个线程最先取得obj对象对其加锁。其他线程则阻塞直到取得obj对象的线程执行代码块,此时被加锁的obj对象得到释放(解锁),其他线程得到通知取得该锁的obj对象。继续执行!
很多情况可以使用synchronized(this){..}来同步代码块,但需要注意的是,使用this作为同步对象的话,如果同一个类中存在多个synchronized(this){..}代码块,其中任何一个synchronized(this)代码块处于被执行状态,则其他线程对其他synchronized(this){..}代码块的访问也会受到阻塞。
需注意:同步代码块synchonized(this){}的多线程阻塞问题(包括synchronized同步方法),在并发处理的系统中(比如WEB服务器)会严重影响性能,建议慎重使用。可以使用sychronized(obj){..}缩小同步资源对象的范围来解决这个问题!
package com.mz.xx.tb;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SynchronizedTest{
private Lock myLock = new ReentrantLock();
/**
* 第一种形式 同步方法
*/
// synchronized public void synchronized_Test1(){
// for(int i = 0;i<10;i++){
// try {
// Thread.sleep(2000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// System.out.println("Synchronized way--"+Thread.currentThread().getName()+": "+i);
// }
// }
/**
* 第二种形式 同步代码块
*/
public void synchronized_Test2(){
synchronized (this) {
for(int i = 0;i<10;i++){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Synchronized way--"+Thread.currentThread().getName()+": "+i);
}
}
}
/**
* 通过ReentrantLock同步代码块
*/
public void reentrantLock_Test(){
myLock.lock();//加锁
try {
for(int i = 0;i<10;i++){
Thread.sleep(2000);
System.out.println("ReentrantLock way--"+Thread.currentThread().getName()+": "+i);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
myLock.unlock();//解锁
}
}
public static void main(String[] args) {
SynchronizedTest synchronizedTest = new SynchronizedTest();
// String waysName = "Synchronized";
String waysName = "ReentruntLockTest";
Thread t1 = new Thread(new Demo(synchronizedTest,waysName));
Thread t2 = new Thread(new Demo(synchronizedTest,waysName));
t1.start();
t2.start();
}
}
class Demo implements Runnable{
private SynchronizedTest synchronizedTest;
private String waysName;
public Demo(SynchronizedTest synchronizedTest,String waysName) {
super();
this.synchronizedTest = synchronizedTest;
this.waysName = waysName;
}
public void run() {
if(waysName.equals("Synchronized")){
// synchronizedTest.synchronized_Test1();
synchronizedTest.synchronized_Test2();
}else if(waysName.equals("ReentruntLockTest")){
synchronizedTest.reentrantLock_Test();
}
}
}
分享到:
相关推荐
在Java编程中,synchronized和ReentrantLock都是用于实现线程同步的重要工具,它们在并发控制方面扮演着关键角色。然而,两者之间存在一些显著的区别,这些差异体现在功能、灵活性、性能以及使用场景上。 首先,...
本文将深入探讨Synchronized关键字锁和ReentrantLock锁的异同、功能特性以及它们在实际应用中的适用场景。 首先,Synchronized是一种内置的Java关键字,它提供了简单而强大的线程同步机制。当一个线程进入一个由...
第15讲丨synchronized和ReentrantLock有什么区别呢?.html
Lock、Synchronized 和 ReentrantLock 的使用 Lock、Synchronized 和 ReentrantLock 是 Java 中三种常用的同步机制,每种机制都有其特点和使用场景。下面对这三种机制进行详细的分析和比较。 一、Synchronized ...
在Java多线程编程中,`ReentrantLock`和`synchronized`都是用于实现线程同步的重要工具,确保在并发环境中数据的一致性和正确性。两者虽然都能实现互斥访问,但在功能、性能以及使用场景上有所不同。下面我们将深入...
Java并发编程中,`synchronized`关键字和`ReentrantLock`是两个重要的同步控制工具,它们主要用于保证多线程环境下的数据一致性与线程安全。本文将深入探讨这两个概念,了解它们的实现原理以及区别。 首先,`...
在Java中,有两种主要的锁机制:内置的`synchronized`关键字和显式的`ReentrantLock`类。这两者各有优劣,适用于不同的场景。下面我们将详细讨论它们的区别、性能、特性以及使用上的差异。 1. **功能对比**: - `...
背景,应该就是Synchronized的缺点Synchronized产生原因,原子性(Atomicity)与可见性(visibility),其中可见性涉及到JM
本资源摘要信息中,我们将详细介绍并发编程相关的知识点,涵盖线程、synchronized、volatile、CAS、Lock、ReentrantLock 等概念,并对相关知识点进行了详细的解释和比较。 线程 在 Java 中,线程是并发编程的基础...
1、本资源包含并发编程基础知识的使用案例,包括:线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的...
java语言 并发编程 ReentrantLock与synchronized区别 详解
《Java并发编程:synchronized、ReentrantLock、volatile与Atomic深度解析》 在Java多线程编程中,正确地管理共享资源是至关重要的。本文将深入探讨四种关键的并发控制机制:synchronized关键字、ReentrantLock(可...
在 java 中有多种同步机制,例如 synchronized 和 ReentrantLock。synchronized 是 Lock 的一种简化实现,而 ReentrantLock 提供了更多的功能。BlockingQueue 的实现也可以用来理解多线程的协调。 在使用 ...
互斥同步,如synchronized和ReentrantLock,通过锁机制确保同一时刻只有一个线程访问资源,防止线程间的竞态条件。非阻塞同步,如基于CAS(Compare-and-Swap)操作的乐观锁,尝试进行操作并检测冲突,若无冲突则成功...
本主题将深入探讨多线程的使用以及线程锁的两种主要实现方式: synchronized关键字和ReentrantLock。 一、多线程基础 1. 线程创建: - 继承Thread类:创建一个新的类,该类继承自Thread类,并重写run()方法。然后...
4. **可重入性**:synchronized和ReentrantLock(Lock的一个实现)都是可重入的,意味着一个线程在持有锁的情况下可以再次获取该锁,防止死锁的发生。 5. **公平性和非公平性**:ReentrantLock提供了公平锁和非公平...
### ReentrantLock 与 synchronized 的比较 #### 一、引言 在Java中,多线程和并发控制一直是程序员关注的重点。随着Java的发展,其语言本身及标准库提供了丰富的工具来帮助开发者处理并发问题。其中,`...
Lock 分为两种:Synchronized 和 ReentrantLock。Synchronized 是一种悲观锁机制,独占锁。ReentrantLock 是一种可重入锁机制,允许线程再次进入同步代码。 StringBuffer 和 StringBuilder StringBuffer 是 Java ...
Java中的synchronized和ReentrantLock等独占锁就是悲观锁思想的实现,而java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。 线程阻塞的代价是很高的,因为线程状态的切换...