一、synchronize对象锁和类锁
synchronize为多线程关键字是一种同步锁,它可以修饰以下几种对象:
代码块:被修饰的代码块被称为同步代码块,作用的范围是{}里面的代码,作用的对象是调用这个代码块的对象
方法:被修饰的方法称为同步方法,作用的范围是整个方法,作用的对象是调用这个方法的对象
类:作用的范围是synchronize后面括号里的部分,作用的对象是当前这个类
1、对象锁
下面由一个栗子引入:
public class TestSynchronize {
//加了对象锁的方法
private synchronized void syn(){
//自定义sleep工具类
SleepTools.second(2);
System.out.println("syn is going..."+this.toString());
SleepTools.second(2);
System.out.println("syn ended..."+this.toString());
}
//调用了对象锁方法的线程1
private static class thread implements Runnable{
private TestSynchronize testSynchronize;
public thread(TestSynchronize testSynchronize){
this.testSynchronize = testSynchronize;
}
@Override
public void run() {
System.out.println("thread is running...");
testSynchronize.syn();
}
}
//调用了对象锁方法的线程2
private static class thread2 implements Runnable{
private TestSynchronize testSynchronize;
public thread2(TestSynchronize testSynchronize){
this.testSynchronize = testSynchronize;
}
@Override
public void run() {
System.out.println("thread2 is running...");
testSynchronize.syn();
}
}
public static void main(String[] args) {
TestSynchronize testSynchronize = new TestSynchronize();
thread thread = new thread(testSynchronize);
TestSynchronize testSynchronize2 = new TestSynchronize();
thread2 thread2 = new thread2(testSynchronize);
//thread2 thread2 = new thread2(testSynchronize2);
new Thread(thread).start();
new Thread(thread2).start();
}
}
/**
当两个线程都将testSynchronize传入时(即使用同一个对象调用加了对象锁的方法)运行结果如下:
thread is running...
thread2 is running...
syn is going...com.zl.synchronize.TestSynchronize@6b52350c
syn ended...com.zl.synchronize