当synchronized作用在方法上时:
如果作用在普通的成员方法上,那么锁住的就是this对象;
如果作用在静态成员方法上,那么锁住的就是类对象;
类对象 !=this对象(需要锁住同一个对象才会产生互斥效果)。
锁住同一对象时(类对象)
public class SynchronizedObjectTest {
static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
public static void main(String[] args) {
Number n1=new Number();
new Thread(() -> {
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" begin");
n1.b();
}).start();
new Thread(() -> {
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" begin");
n1.a();
}).start();
}
}
class Number{
static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
public static synchronized void a(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" 1");
}
public static synchronized void b(){
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" 2");
}
}
输出结果:
2022-02-08 16:04:11 814 begin
2022-02-08 16:04:11 814 begin
2022-02-08 16:04:12 816 1
2022-02-08 16:04:12 816 2
或者
2022-02-08 16:03:21 934 begin
2022-02-08 16:03:21 934 begin
2022-02-08 16:03:21 935 2
2022-02-08 16:03:22 936 1
当锁住不同对象时(类对象和this对象)
public class SynchronizedObjectTest {
static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
public static void main(String[] args) {
Number n1=new Number();
new Thread(() -> {
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" begin");
n1.a();
}).start();
new Thread(() -> {
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" begin");
n1.b();
}).start();
}
}
class Number{
static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
public static synchronized void a(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" 1");
}
public synchronized void b(){
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" 2");
}
}
输出结果:
2022-02-08 16:09:01 520 begin
2022-02-08 16:09:01 520 begin
2022-02-08 16:09:01 521 2
2022-02-08 16:09:02 525 1
当锁住不同对象时(不同this对象)
public class SynchronizedObjectTest {
static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
public static void main(String[] args) {
Number n1=new Number();
Number n2=new Number();
new Thread(() -> {
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" begin");
n1.a();
}).start();
new Thread(() -> {
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" begin");
n2.b();
}).start();
}
}
class Number{
static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
public synchronized void a(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" 1");
}
public synchronized void b(){
System.out.println(sdf.format(new Date(Calendar.getInstance().getTimeInMillis()))+" 2");
}
}
输出结果:
2022-02-08 16:14:44 347 begin
2022-02-08 16:14:44 347 begin
2022-02-08 16:14:44 348 2
2022-02-08 16:14:45 349 1
本文通过实例分析了Java中`synchronized`关键字在成员方法和静态方法上的应用,展示了不同锁对象(类对象和实例对象)对并发执行的影响。当锁住同一对象时,线程间产生互斥;而锁住不同对象时,线程可以并发执行,揭示了同步方法的并发控制原理。
3649

被折叠的 条评论
为什么被折叠?



