static synchronized方法与synchronized class是不是一把锁

不废话上代码:

package com.learn.bao.mutithread;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.CountDownLatch;

public class TestGet {

private List<String> list = new ArrayList<String>();

private static CountDownLatch l = new CountDownLatch(2);

public List<String> getList() throws InterruptedException {

synchronized (TestGet.class) {

System.err.println("getList() sleep");

Thread.sleep(5000);

l.countDown();

System.err.println("end getList() sleep");

return list;

}

}

public static synchronized void getNull() {

try {

System.err.println("getNull() sleep");

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.err.println("end getNull() sleep");

l.countDown();

return;

}

public class Test implements Runnable {

private TestGet t;

private int i;

public Test(TestGet t, int i) {

this.t = t;

this.i = i;

}

@Override

public void run() {

if (i == 0) {

try {

t.getList();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

if (i == 1) {

TestGet.getNull();

}

}

}

public static void main(String[] args) throws InterruptedException {

TestGet t = new TestGet();

for (int i = 0; i <= 1; i++) {

Thread tr = new Thread(t.new Test(t, i));

tr.start();

}

l.await();

}

}

结果:getList() sleep

end getList() sleep

getNull() sleep

end getNull() sleep

串行的结果,所以可以看出来 synchroized当前class和static方法加上synchroized关键词是一把锁。

时间: 2024-10-11 01:08:15

static synchronized方法与synchronized class是不是一把锁的相关文章

java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解

synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法.如:public synchronized void accessVal(int newVal);synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否

一个线程进入一个对象的一个synchronized方法后

分这几种情况: 1.其他方法前是否加了synchronized关键字,如果没加,则能. 2.如果这个方法内部调用了wait,则可以进入其他synchronized方法. 3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能. 4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传

为什么构造器不能是abstract, static, final, native or synchronized的?

Unlike methods, a constructor cannot be abstract, static, final, native  or synchronized. 1. A constructor is not inherited, so there is no need to declare it final 2. As the same reason above, an abstract constructor could never be implemented. 3. A

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法 对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的. 1 public class TT implements Runnable { 2 int b = 100; 3 public synchronized void m1(){ 4 b = 10000; 5 try { 6 Thread. sleep(5000); 7 System. out.prin

当一个线程进入一个对象的一个synchronized方法后, 其它线程是否可进入此对象的其它方法?

分几种情况: 1.其他方法前是否加了synchronized关键字,如果没加,则能. 2.如果这个方法内部调用了wait,则可以进入其他synchronized方法. 3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能. 4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能 同步,因为非静态的方法用的是this.

多线程:synchronized代码块、synchronized方法、静态synchronized方法使用的锁

在学习多线程的过程中,很多资料都会指出synchronized代码块和synchronized方法使用的锁都是this ,静态synchronized方法使用的锁是类锁,那么从这个结论出发,如何进行逆向证明呢? 证明this锁 `` public class ThreadDemo3 {    public static void main(String[] args) throws InterruptedException{        MyThread3 mt = new MyThread3

java线程总结--synchronized关键字,原理以及相关的锁

在多线程编程中,synchronized关键字非常常见,当我们需要进行"同步"操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只能同时有一条线程访问该代码块. 上面是很多人的认识,当然也是我之前对synchronized关键字的浅显认识,其实上面的观点存在一定的偏差.在参考了很多文章以及自己动手测试过相关代码后,我觉得有必要记录下自己对synchronized关键字的一些理解,在这个过程,会简单说说synchronized关键字的具体

四、java多线程核心技术——synchronized同步方法与synchronized同步快

一.synchronized同步方法 论:"线程安全"与"非线程安全"是多线程的经典问题.synchronized()方法就是解决非线程安全的. 1.方法内的变量为线程安全 public void addI(String username) { try { int num = 0; \\方法内的变量为线程安全 if (username.equals("a")) { num = 100; System.out.println("a set

synchronized(this)与synchronized(class)

本文转自:http://wangym.iteye.com/blog/1265973 RunnableTest.java: /** * */ package concurrency; /** * @author xuanyin * */ public class RunnableTest implements Runnable { /** * */ private static boolean flag = true; /** * 使用synchronized方法 */ private stati