/**
* 用于测试synchronized修饰static代码块
*
*
* 1 class锁是程序开始的时候就只有的一把,各个对象之间互斥
*
* 2 static方法 和 synchronized(SynchronizedWithSyncBlockThread.class) 区别在于锁的范围不一样
*/
public class SynchronizedWithSyncBlockThread extends Thread{
private void print(){
synchronized(SynchronizedWithSyncBlockThread.class){
//输出调用的线程及调用时的时间戳
System.out.println(System.currentTimeMillis()+" Call staticSynchronizedMethod by "+Thread.currentThread().getName());
try {
//调用线程休眠5秒,锁竞争效果更加明显
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
print();
}
public static void main(String[] args) {
SynchronizedWithSyncBlockThread t1=new SynchronizedWithSyncBlockThread();
SynchronizedWithSyncBlockThread t2=new SynchronizedWithSyncBlockThread();
SynchronizedWithSyncBlockThread t3=new SynchronizedWithSyncBlockThread();
t1.start();
t2.start();
t3.start();
}
}
/**
* 用于测试synchronized修饰static方法的线程类
*
*
* class锁是程序开始的时候就只有的一把,各个对象之间互斥
*/
public class SynchronizedWithStaticMethodThread extends Thread{
private static synchronized void print(){
//输出调用的线程及调用时的时间戳
System.out.println(System.currentTimeMillis()+" Call staticSynchronizedMethod by "+Thread.currentThread().getName());
try {
//调用线程休眠5秒,锁竞争效果更加明显
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
print();
}
public static void main(String[] args) {
SynchronizedWithStaticMethodThread t1=new SynchronizedWithStaticMethodThread();
SynchronizedWithStaticMethodThread t2=new SynchronizedWithStaticMethodThread();
SynchronizedWithStaticMethodThread t3=new SynchronizedWithStaticMethodThread();
t1.start();
t2.start();
t3.start();
}
}
总结 :static 修饰的方法和sychronized(.class) 效果一样
第二 无static
public class SynchronizedWithNoStaticMethodThread extends Thread{
private synchronized void print(){
//输出调用的线程及调用时的时间戳
System.out.println(System.currentTimeMillis()+" Call staticSynchronizedMethod by "+Thread.currentThread().getName());
try {
//调用线程休眠5秒,锁竞争效果更加明显
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
print();
}
public static void main(String[] args) {
SynchronizedWithNoStaticMethodThread t1=new SynchronizedWithNoStaticMethodThread();
SynchronizedWithNoStaticMethodThread t2=new SynchronizedWithNoStaticMethodThread();
SynchronizedWithNoStaticMethodThread t3=new SynchronizedWithNoStaticMethodThread();
t1.start();
t2.start();
t3.start();
}
}
public void showB() {
synchronized (this) {//this只是对当前对象起作用
System.out.println("showB...");
System.out.println(System.currentTimeMillis()+" Call staticSynchronizedMethod by "+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
总结 : synchronized(this ) 和synchronized 修饰的方法,效果一样 ,只是锁范围不一样
第三 测试static 修饰的变量
public class testSysn2 {
/**
* 类变量
*/
private static Object staticObj=new Object();
/**
* 成员变量
*/
Object local=new Object();
public static synchronized void showA() throws InterruptedException{
System.out.println("showA...");
System.out.println(System.currentTimeMillis()+" Call staticSynchronizedMethod by "+Thread.currentThread().getName());
Thread.sleep(5000);
}
public void showB() {
synchronized (staticObj) {
System.out.println("showB...");
System.out.println(System.currentTimeMillis()+" Call staticSynchronizedMethod by "+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void showC() {
synchronized (testSysn2.class) {
System.out.println("showC...");
System.out.println(System.currentTimeMillis()+" Call staticSynchronizedMethod by "+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void showD() {
synchronized (local) {
System.out.println("showD...");
System.out.println(System.currentTimeMillis()+" Call staticSynchronizedMethod by "+Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
testSysn2 test= new testSysn2();
new Thread(new Runnable() {
@Override
public void run() {
try {
test.showA();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
test.showB();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
test.showC();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
test.showD();
}
}).start();
}
}
总结 :static 修饰的变量无效果,和普通变量一样