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

java 的synchronized 同步的影响范围

 
阅读更多
1.一个类里面有两个synchronized方法是否可以同步执行 ,结果是:不可以
public class PrintThread3 {

	public synchronized void test1(){
		for(int i=0;i<100;i++){
			System.out.println("*********");
		}
	}
	public synchronized void test2(){
		for(int i=0;i<100;i++){
			System.out.println("%%%%%%%%%%");
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		final PrintThread3 ttttt = new PrintThread3();
		Thread thread1 = new Thread(){
			public void run() { 
				ttttt.test1();
			} 		
		};
		Thread b = new Thread() { 
			public void run() { 
				ttttt.test1();
				} 
			}; 
	}

2.今天用到java来实现多线程环境下的单件模式例子,才发现关于synchronized还是有一些地方需要比较小心的。
  synchronized是对当前的实例进行加锁,要注意是“当前实例”,也就是说,假如你有两个实例化对象,那么可以同时访问这两个实例里面的synchronized块。但是,当访问一个实例里面的一个synchronized块时,其余的synchronized是不可同时访问的,原因是整个实例都被加了锁。
  那假如说是static synchronized时会怎么样呢? 那么static synchronized恰好就是要控制类的所有实例的访问了,static synchronized是限制线程同时访问jvm中该类的所有实例同时访问对应的代码块。实际上,假如类中某一个方法或者说某个代码块是synchronized的话,那在实例化时就会自动生成一个监视块,用于不同线程之间访问的互斥。而static synchronized则是所有该类的实例公用一个监视块了。
  有一个例子:
  pulbic class Something(){
  public synchronized void isSyncA(){}
  public synchronized void isSyncB(){}
  public static synchronized void cSyncA(){}
  public static synchronized void cSyncB(){}
  }
  那么,加入有Something类的两个实例a与b,那么下列组方法可以被1个以上线程同时访问呢?
  a.   x.isSyncA()与x.isSyncB()
  b.   x.isSyncA()与y.isSyncA()
  c.   x.cSyncA()与y.cSyncB()
  d.   x.isSyncA()与Something.cSyncA()
  a的话是同个实例中的,故不可以;b中是不同实例的,所以可以同时访问;c中是针对static synchronized,上文所说所有的static方法共用一个监视块,故不能够同时访问;那么d呢?实际上是可以的,原因可以自己思考一下。
    原因:synchronized的实例方法和synchronized的类方法由于锁定(lock)不同,因此可以从数个线程来同时执行。
  同时还有一点,synchronized关键字是不能够继承的。
分享到:
评论

相关推荐

    java同步synchronized关键字用法示例

    - **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...

    基于Java synchronized同步锁实现线程交互.pdf

    "基于Java synchronized同步锁实现线程交互" Java多线程能够提高CPU利用效率,但也容易造成线程不安全、线程死锁等问题。Java synchronized同步锁可以保证同一时刻只有一个线程操作同一资源,使用wait()、notify()...

    Java synchronized使用案例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...

    java中synchronized用法

    Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,synchronized 关键字可以作用于 instance 变量...

    java锁机制Synchronizedjava锁机制Synchronized

    使用 Synchronized 代码块可以缩小同步的影响范围,提高程序的运行效率。同时,Synchronized 代码块也可以在一定时期内霸占某个对象的钥匙,避免其他线程访问该对象的上锁房间。 Synchronized 的使用原则 ...

    Java synchronized详细解读.docx

    Java中的`synchronized`关键字是多线程编程中用于同步控制的关键元素,它的主要目标是解决并发环境下多个线程对共享资源的访问冲突。在Java中,由于线程共享内存空间,如果没有适当的同步机制,可能会导致数据不一致...

    java synchronized demo

    在Java编程语言中,`synchronized`关键字是一个非常重要的概念,它用于实现线程同步,以确保多线程环境下的数据一致性与安全性。本示例"java synchronized demo"旨在探讨`synchronized`关键字的用法及其作用机制。...

    详细解读java同步之synchronized解析

    【Java同步之synchronized解析】 Java中的`synchronized`关键字是实现多线程同步的重要机制,它确保了在并发环境中对共享资源的访问是线程安全的。以下是对`synchronized`的详细解读: ### 1. synchronized的特性 ...

    14.线程的同步机制-synchronized同步方法-局部变量为线程安全.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java里面synchronized用法.doc

    Java 中的 synchronized 用法详解 Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized ...

    java synchronized 学习

    Java 中的 synchronized 关键字是用来实现线程同步的,它可以用来修饰方法、代码块和静态方法,以确保在多线程环境下数据的一致性。 一、进程和线程的区别 在计算机中,每个运行着的 xxxx.exe 都是一个进程,而...

    Java 同步锁(synchronized)详解及实例

    Java中的同步锁,即`synchronized`关键字,是Java多线程编程中用于解决并发问题的重要机制。它确保了对共享资源的互斥访问,防止数据的不一致性。当我们有多线程环境并涉及到共享数据时,可能会出现竞态条件,就像...

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

    3. **同步作用域**:`synchronized`的作用范围决定了锁的粒度。它可以作用于整个方法或特定的代码块,但不能作用于局部变量。 **示例解析:** 在提供的示例中,`MyRunable`类的`run()`方法使用`synchronized(this)...

    java的线程同步机制synchronized关键字的理解_.docx

    Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...

    [JAVA][synchronized的使用]

    在Java编程语言中,`synchronized`关键字是一个至关重要的概念,它主要用于实现线程同步,以确保多线程环境下的数据一致性与安全性。本篇文章将深入探讨`synchronized`的使用,包括其基本原理、使用方式以及实际应用...

    Java线程及同步(synchronized)样例代码

    ### Java线程及同步(synchronized)样例代码解析 #### 一、概述 本篇文章主要分析一个关于Java线程及其同步机制(synchronized)的示例代码。该示例展示了如何在多线程环境中使用`synchronized`关键字来实现线程...

    java synchronized关键字原理、自定义一把锁来实现同步等

    `synchronized` 是 Java 中的关键字之一,用于实现线程间的同步控制,确保共享资源的安全访问。它主要应用于以下两种场景: 1. **同步方法**:在类的方法声明前加上 `synchronized` 关键字,则该方法成为同步方法。...

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

    在Java编程语言中,线程(Thread)、同步(synchronized)和并发(Concurrency)是核心概念,它们在多任务处理和高效系统设计中扮演着重要角色。本文将深入探讨这三个主题,以及它们如何相互作用以确保程序的正确性...

    java synchronized同步静态方法和同步非静态方法的异同

    在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要机制,它确保了...需要注意的是,过度使用`synchronized`可能会导致性能下降,因为它会阻塞线程,因此在设计并发程序时,应谨慎考虑同步的粒度和范围。

Global site tag (gtag.js) - Google Analytics