`
wenzongliang
  • 浏览: 461326 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java中的synchronized临界区使用

阅读更多

synchronized的3种用法
1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.
例如:
public synchronized void synMethod() {
//方法体
}
2.synchronized后面括号里是一对象,此时,线程获得的是对象锁.例如:
public class MyThread implements Runnable {
public static void main(String args[]) {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt, "t1");
Thread t2 = new Thread(mt, "t2");
Thread t3 = new Thread(mt, "t3");
Thread t4 = new Thread(mt, "t4");
Thread t5 = new Thread(mt, "t5");
Thread t6 = new Thread(mt, "t6");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
public void run() {
synchronized (this) {
System.out.println(Thread.currentThread().getName());
}
}
}
对于2,如果线程进入,则得到对象锁,那么别的线程在该类所有对象上的任何操作都不能进行.在对象级使用锁通常是一种比较粗糙的方法。为什么要将整个对象都上锁,而不允许其他线程短暂地使用对象中其他同步方法来访问共享资源?如果一个对象拥有多个资源,就不需要只为了让一个线程使用其中一部分资源,就将所有线程都锁在外面。由于每个对象都有锁,可以如下所示使用虚拟对象来上锁:
class FineGrainLock {
MyMemberClass x, y;
Object xlock = new Object(), ylock = new Object();
public void foo() {
synchronized(xlock) {
//access x here
}
//do something here - but don‘t use shared resources
synchronized(ylock) {
//access y here
}
}
public void bar() {
synchronized(this) {
//access both x and y here
}
//do something here - but don‘t use shared resources
}
}


3.synchronized后面括号里是类.例如:
class ArrayWithLockOrder{
private static long num_locks = 0;
private long lock_order;
private int[] arr;
public ArrayWithLockOrder(int[] a)
{
arr = a;
synchronized(ArrayWithLockOrder.class) {//-----------------------------------------这里
num_locks++; // 锁数加 1。
lock_order = num_locks; // 为此对象实例设置唯一的 lock_order。
}
}
public long lockOrder()
{
return lock_order;
}
public int[] array()
{
return arr;
}
}
class SomeClass implements Runnable
{
public int sumArrays(ArrayWithLockOrder a1,
ArrayWithLockOrder a2)
{
int value = 0;
ArrayWithLockOrder first = a1; // 保留数组引用的一个
ArrayWithLockOrder last = a2; // 本地副本。
int size = a1.array().length;
if (size == a2.array().length)
{
if (a1.lockOrder() > a2.lockOrder()) // 确定并设置对象的锁定
{ // 顺序。
first = a2;
last = a1;
}
synchronized(first) { // 按正确的顺序锁定对象。
synchronized(last) {
int[] arr1 = a1.array();
int[] arr2 = a2.array();
for (int i=0; i value += arr1[i] + arr2[i];
}
}
}
return value;
}
public void run() {
//...
}
}
对于3,如果线程进入,则线程在该类中所有操作不能进行,包括静态变量和静态方法,实际上,对于含有静态方法和静态变量的代码块的同步,我们通常用4来加锁.


以上3种之间的关系:
锁是和对象相关联的,每个对象有一把锁,为了执行synchronized语句,线程必须能够获得synchronized语句中表达式指定的对象的锁,一个对象只有一把锁,被一个线程获得之后它就不再拥有这把锁,线程在执行完synchronized语句后,将获得锁交还给对象。
在方法前面加上synchronized修饰符即可以将一个方法声明为同步化方法。同步化方法在执行之前获得一个锁。如果这是一个类方法,那么获得的锁是和声明方法的类相关的Class类对象的锁。如果这是一个实例方法,那么此锁是this对象的锁。

我的话费充值店-各种面额

电信100元仅售98.60 
联通100仅售99.00
移动100仅售99.30

分享到:
评论

相关推荐

    Java多线程 之 临界区、ThreadLocal.docx

    总结来说,Java中的临界区通过`synchronized`关键字或Lock对象来保证多线程环境下的数据一致性,而ThreadLocal则通过为每个线程提供变量的独立副本,避免了共享资源的并发问题。在实际编程中,开发者需要根据具体...

    java_synchronized详解

    ### Java synchronized 关键字详解 #### 一、synchronized关键字简介 `synchronized`是Java语言提供的关键字之...但是过度使用或不当使用也可能导致性能下降或死锁等问题,因此在实际开发中需要根据具体情况谨慎选择。

    java synchronized demo

    在Java编程语言中,`...总结,`java synchronized demo`是一个关于如何在Java中使用`synchronized`关键字进行线程同步的示例,通过理解和实践这个例子,开发者可以更好地掌握多线程环境下数据安全和同步的重要性。

    Java中synchronized实现原理详解

    如果成功,线程进入临界区;如果失败,线程会被阻塞,直到获得锁。`monitorexit`指令用于释放锁,确保每个`monitorenter`都有对应的`monitorexit`。 在JDK 1.6及以后版本,为了提高性能,引入了锁的优化措施,如...

    Java synchronized关键_动力节点Java学院整理

    1. **对象锁**:每个Java对象都可以作为一个锁,当调用对象的`synchronized`方法或在代码块中使用`synchronized`关键字时,会获取到这个对象的锁。如果多个线程尝试访问同一个对象的同步代码,只有一个线程能够获得...

    临界区进程互斥模拟

    在本课程设计中,我们将使用Java语言来模拟临界区资源的访问,通过创建多个进程来实现进程之间的互斥。 设计的目标是实现两个用户进程和一个管理进程。用户进程将模拟需要进入临界区的程序,而管理进程则负责处理...

    Java并发-Synchronized关键字.docx

    本文将探讨Synchronized关键字在解决并发控制中的作用及其使用方式。 首先,让我们回顾一下问题的背景:在给出的示例代码中,创建了10个线程,每个线程都对共享变量`count`进行10000000次的累加操作。理论上,最终...

    Java使用synchronized修饰方法来同步线程的实例演示

    本文将深入探讨synchronized修饰方法在Java中的使用及其工作原理,并通过实例演示其应用。 1. **synchronized原理** synchronized基于Java的内置锁(也称为对象锁或 monitors)机制。当一个线程进入synchronized...

    基于软件互斥算法的临界区进程互斥的模拟实现

    总结来说,这个实验涵盖了操作系统中的关键概念,包括临界区、互斥、并发控制以及Java的线程同步机制。通过实现和可视化这些经典算法,学生能够深入理解并发编程中的挑战和解决方案,为今后的后端开发工作打下坚实...

    Java Synchronized的使用详解

    Synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。Synchronized的实现原理是使用锁机制,锁可以是当前实例对象、当前类对象或给定对象。...

    java Thread & synchronized & concurrent 线程、同步、并发

    这样可以防止竞态条件,确保临界区的原子性。 并发处理是为了最大化利用多核处理器的计算能力。Java提供了丰富的并发工具类,如`Semaphore`信号量、`CyclicBarrier`屏障、`CountDownLatch`倒计时器和`Future`未来...

    Java多线程同步机制的应用分析.pdf

    Java多线程同步机制的应用分析是指在Java语言中,如何使用同步机制来保护临界区,以避免多线程之间的冲突和错误。该机制通过管程机制和同步语法来保护临界区,使得多线程可以安全、高效地运行。 在多线程编程中,...

    Mutual-Exclusion-for-Distributed-Systems:设计并开发了一个系统,该系统使用 Maekawa 基于仲裁的互斥协议,允许多个请求站点中的一个站点在给定时间使用 SCTP 和 Java 中的多线程进入临界区

    通过Java的`Thread`类和相关同步机制(如`synchronized`关键字、`java.util.concurrent`包中的工具类),可以实现对临界区的并发控制。多线程使得系统能够同时处理多个请求,提高整体性能,而同步机制则保证了在共享...

    java中的锁

    1. 同步方法:在方法声明前加上synchronized关键字,整个方法体被视为一个临界区,同一时间只能有一个线程执行该方法。 ```java public synchronized void method() { // 临界区代码 } ``` 2. 同步代码块:通过...

    同步代码块(synchronized).zip

    这在处理共享资源或临界区时尤其重要,防止多个线程同时修改导致数据错误。 同步代码块的基本语法如下: ```java synchronized (object) { // 需要同步的代码 } ``` 其中,`object`是监视器对象,通常是包含共享...

    java中生产者和消费者模型

    `synchronized`关键字用于创建临界区,确保同一时间只有一个线程能够访问特定的代码块或方法,防止数据竞争。在生产者-消费者模型中,当缓冲区为空时,消费者线程调用`wait()`进入等待状态,释放对共享资源(如缓冲...

    java-syn.zip_Java syn_Java syn锁_java同步锁syn_java锁 syn_syn同步事务锁

    这种方式下,整个方法体被视为一个临界区,线程必须获取到对象的监视器锁才能执行。 2. **同步代码块**: 对于更细粒度的控制,可以使用同步代码块,只锁定必要的代码区域: ```java synchronized (object) { ...

    java哲学家就餐问题

    此外,synchronized关键字是Java中的另一种同步机制,它可以用于保护临界区,防止多个线程同时进入可能导致数据不一致的代码段。在哲学家就餐问题中,如果不使用信号量,我们也可以考虑使用synchronized来控制哲学家...

    Java线程安全synchronized

    这样的资源被称为共享资源或临界区。  举个例子:  一个共享变量m,现在有两个线程同时对它进行累加操作,各执行10000次,那么我么期待的结果是20000,但实际上并不是这样的。看代码: package ...

    java同步互斥信号量问题

    在这个例子中,`criticalSection`方法代表临界区,只有一个线程可以同时执行。`Semaphore`确保了互斥访问,即任何时候只有一个线程在执行临界区的代码。 总结来说,Java同步互斥和信号量是解决多线程环境下资源访问...

Global site tag (gtag.js) - Google Analytics