public class SyncTest {
public static void main(String[] args) {
A a = new A();
// A a2 = new A();
new Thread(new Runnable() {
@Override
public void run() {
a.f2();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
A.f3();
}
}).start();
}
}
class A {
public synchronized void f1() {
for (int i = 1; i <= 10; i++) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
public void f2() {
synchronized (""/A.class){
for (int i = 100; i <= 110; i++) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
}
public synchronized static void f3() {
for (int i = 200; i <= 210; i++) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
}
同步是按顺序执行,异步是无需等待,直接执行其它的线程;
在A类中的f1和f2方法,synchronize修饰非静态方法、同步代码块的synchronize(this)和synchronize(非this对象)的用法锁的是对象,线程想要执行对应的同步代码,需要获得对象锁。
f3方法,或f2中synchronize(A.class)同步代码块,synchronize修饰静态方法以及同步代码块的synchronize(类.class)用法锁是类,线程想要执行对应的同步代码,需要获得类锁。
分布式锁
一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁
redis分布式锁是最好的,在多个服务间执行对同一个数据库中数据的修改,会出现数据不一致性,这时分布式锁产生了,通过对redis设置SET_IF_NOT_EXIST,判断操作的当前数据是否已经执行完操作,并设置失效时间来释放锁,具体操作参考https://www.cnblogs.com/linjiqin/p/8003838.html.