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

JAVA静态方法synchronized锁定类

阅读更多

面试的时候遇到一个问题,继承关系的静态方法是否可以覆写。

根据对JAVA语言的了解,静态方法是和类绑定的,因此不存在覆写,在运行时,继承关系应该是针对对象的,而不是类的。

具体的方式参考http://phl.iteye.com/blog/2029729

 

在这儿写一下多线程访问的时候锁定的状况。

 

public class child extends father {

	public synchronized static String call() throws InterruptedException {
		System.out.println("this is in child");
		Thread.sleep(10000);
		return "child";
	}
}

 

 

public class father {

	public synchronized static String call() throws InterruptedException{
		System.out.println("this is in father");
		Thread.sleep(10000);
		return "father";
	}
}

 

 

 

public class extendTest implements Callable<String> {

	private CountDownLatch begin;

	public extendTest(CountDownLatch begin) {
		this.begin = begin;
	}

	@Override
	public String call() throws Exception {
		try {
			begin.await();
			Random r = new Random();
			if (r.nextBoolean()) {
				return child.call();
			} else {
				return father.call();
			}

		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public static void main(String args[]) throws InterruptedException, ExecutionException {
		CountDownLatch begin = new CountDownLatch(1);
		ExecutorService es = Executors.newFixedThreadPool(10);
		List<Future<String>> result = new ArrayList<Future<String>>();
		for (int i = 0; i < 10; i++) {
			extendTest et = new extendTest(begin);
			Future<String> r = es.submit(et);
			result.add(r);
		}
		begin.countDown();
		es.shutdown();

		for (Future<String> fs : result) {
			System.out.println(fs.get());
		}
	}
}

 

 

输出结果:

this is in child

this is in father

//停顿

this is in child

this is in father

//停顿

this is in child

child

child

father

this is in father

this is in child

father

this is in father

child

this is in child

child

father

this is in father

father

child

father

 

数据的返回结果说明形成了是一个在father类和child类上面的阻塞队列,排队进入锁块。

 

如有问题请留言。

 

分享到:
评论

相关推荐

    静态方法同步 与 非静态方法同步

    因此,当一个静态方法被synchronized修饰时,锁住的是类的Class对象,而不是具体的实例对象。这意味着所有实例共享同一个锁,不论创建了多少个对象,所有线程在调用静态同步方法时都会争夺这个单一的锁。这样的同步...

    深入理解java中的synchronized关键字

    如果是静态方法,则获取的是类的锁。这意味着在同一时间,只有一个线程可以执行该方法,其他尝试访问的线程会被阻塞,直到持有锁的线程执行完毕并释放锁。 **优点**:synchronized方法能够方便地保护整个方法的...

    Java synchronized详细解读.docx

    对于静态(`static`)方法,`synchronized`关键字锁定的是类的Class对象,因此,无论有多少个类的实例,所有线程在访问静态同步方法时都需要获取类的Class对象锁。这意味着,即使有多个类实例,所有线程也无法同时执行...

    java synchronized demo

    通常,`GenerateCode.java`会定义包含`synchronized`的关键类或方法,而`SynchronizedTest.java`会创建多个线程来测试并发访问,观察`synchronized`的效果。 总结,`java synchronized demo`是一个关于如何在Java中...

    【ASP.NET编程知识】实例解析Java中的synchronized关键字与线程安全问题.docx

    4. **synchronized 类(类锁)**:可以使用 `synchronized` 关键字配合 `className.class` 来锁定整个类,这意味着任何对该类的静态成员的访问都会受到同步控制。 在提供的代码示例中,`MyThread` 类有两个方法:`...

    深入理解Java并发之synchronized实现原理.docx

    2. 修饰静态方法:当应用于静态方法时,锁定的是当前类的Class对象,而不是实例对象。这意味着所有实例共享同一把锁,因此任何线程在访问静态同步方法时都需要获取类对象的锁。 3. 修饰同步代码块:同步代码块允许...

    Java并发编程系列- synchronized

    2. **修饰静态方法**:如果`synchronized`修饰的是静态方法,那么它锁定的是当前类的Class对象,而不是实例对象。因此,所有线程在访问类的静态`synchronized`方法时都需要获取到类的锁,而非单个实例的锁。 3. **...

    Java并发-Synchronized关键字.docx

    为了解决这类问题,Java提供了`synchronized`关键字,它提供了一种锁机制,确保共享数据在同一时间只能被一个线程访问。在第一个示例中,没有使用`synchronized`,因此所有线程都可以并发地对`count`进行修改,导致...

    synchronized用法大全实例

    - **类锁**:当`synchronized`修饰静态方法时,锁定的是类的Class对象。任何线程访问该类的静态同步方法,都必须先获得类锁。例如: ```java public class MyClass { public static synchronized void method() ...

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

    2. **类锁**:对于类的静态方法,锁是对类的Class对象进行锁定,意味着所有线程访问同一类的静态`synchronized`方法时,都将争夺同一个锁。 3. **监视器锁**:`synchronized`关键字实际上基于Java的监视器锁...

    Java多线程synchronized关键字详解(六)共5

    - **方法同步**:通过在方法声明前加上`synchronized`关键字,整个方法体将被锁定。这意味着同一时间只有一个线程可以执行该方法。 ```java public synchronized void method() { // 方法体 } ``` - **代码块...

    java基本教程之synchronized关键字java多

    对于静态方法,锁是对应的类的Class对象。 三、synchronized的两种使用形式 1. 同步方法: ```java public synchronized void methodName() { // 代码块 } ``` 2. 同步代码块: ```java synchronized (object) { ...

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

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

    synchronized的几种示例

    总结来说,`synchronized`关键字在Java中提供了线程安全的保证,通过方法加锁、代码块加锁和静态方法加锁,我们可以根据需求选择合适的同步策略。正确使用`synchronized`可以避免竞态条件和死锁等问题,从而保证多...

    Javasynchronized机制.pdf

    当`synchronized`应用于静态方法时,锁的对象是类的Class对象,而不是类的实例。这意味着,所有类的实例共享同一把锁,因此,即使有多个类的实例,也只有单个线程能执行静态同步方法。 ```java public class ...

    Java 中 synchronized的用法详解(四种用法)

    当 `synchronized` 用于静态方法时,锁定的是类的 Class 对象,而不是实例对象。这意味着所有线程在访问此类的静态 `synchronized` 方法时都将受到限制。例如: ```java public class MyClass { public static ...

    java关键字Synchronized详解

    - **修饰静态方法**:同步整个类的方法,所有实例共享同一把锁,锁的是类的Class对象。 - **修饰成员方法**:同步单个实例的方法,锁的是实例对象本身。 - **同步代码块**:可以指定锁对象,锁的是给定的对象,...

    synchronized枷锁实例

    例如,一个线程可以调用类的静态同步方法,同时另一个线程调用同一个类的实例同步方法,这两个操作是可以并发进行的,因为它们锁定的对象不同。 在实际开发中,正确地使用`synchronized`关键字可以有效地避免线程...

    深入讲解java线程与synchronized关键字

    对静态方法来说,锁定的是对应的类。 - **修饰代码块**:synchronized还可以用于修饰代码块,指定一个对象作为监视器,只允许拥有该对象锁的线程执行该代码块。 5. **synchronized的重要特性** - **互斥性**:...

    synchronized详解

    当`synchronized`应用于静态方法时,锁对象是类的Class对象。这意味着,无论类的多少实例,只有一个线程可以执行静态同步方法。这是因为静态方法是属于类的,而不是类的实例,所以所有的类实例共享同一把锁。 理解...

Global site tag (gtag.js) - Google Analytics