synchronized同步锁
同步和异步:
同步:(有等待过程)
指发送一个请求,需要等待返回,然后才能发送下一个请求,有等待过程。
异步:(没有等待过程)
指发送一个请求,不需要等待返回,随时能发送下一个请求,没有等待过程。
1.此关键字修饰在方法上
比如:
public synchronized void method(){
//代码块
}
2.此关键字修饰在对象上
比如:
synchronized(某个对象){
//同步代码块
}
3.此关键字修饰在类上
比如:
synchronized(类名.class){
//同步代码块
}
●synchronized修饰方法
1.
同一个实例对象
两个方法
一个是synchronized修饰的方法
一个没有synchronized修饰的方法
两个方法互不影响
异步 并行执行
public synchronized void methodA(){
//代码块
}
public void methodB(){
//代码块
}
public static void main(String[] args) {
SynchronizedTest1 test1=new SynchronizedTest1();
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
test1.methodA();
}
});
t1.start();
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
test1.methodB();
}
});
t2.start();
}
2.
同一个实例对象
两个方法
都是synchronized修饰的方法
同步 串行执行
3.
两个实例对象
两个方法
都是synchronized修饰的方法
异步 并行执行
4.
两个实例对象
一个synchronized修饰的方法
异步 并行执行
5.
同一个实例对象
一个synchronized修饰的方法
同步 串行执行
●synchronized修饰对象
1.
synchronized同步代码块测试
同一个实例对象
两个线程
一个调用synchronized代码块
一个不调用synchronized代码块
异步 并行运行
public void methodA(){
synchronized (this) {
//代码块
}
}
public void methodB(){
//代码块
}
2.
synchronized同步代码块测试
同一个实例对象
两个线程都调用synchronized代码块
同步 串行运行
3.
synchronized同步代码块测试
两个实例对象
两个线程
分别调用synchronized代码块
异步 并行运行
●synchronized类锁
1.
同一个实例对象
synchronized方法
synchronized(类名.class)
异步 并行执行
2.
同一个实例对象
static synchronized方法
synchronized(类名.class)
同步 串行执行
●synchronized同步代码块和同步方法测试
同一个实例对象
A.synchronized修饰的方法
B.调用synchronized(this)代码块,给this对象上锁
C.调用synchronized(Obj),这个是作用在obj对象上,给obj对象添加锁
A和C:异步 并行执行
A和B:同步 串行执行
B和C:异步 并行执行
执行顺序看调用顺序