1.落笔缘由
还是朝花夕拾,将以前记在笔记本上的笔记记录下来,还从网上查了一下资料,查漏补缺。
2.synchronized理解
synchronized主要作用是在多线程的同步机制对资源进行加锁,在同一时刻只能有一个线程能对加锁部分进行操作,从而避免多个线程同时对同一个对象进行操作而引起数据混乱的问题。
3.synchronized用法
synchronized有两种用法,一种是用来修饰方法,称之为同步方法;一种是直接对代码块进行同步,我们简称为同步块。
1)同步方法
如下,在TestObject类中对sayHello方法进行同步,当多个线程同时调用TestObject的一个实例(注意,多个线程必须对同一个TestObject实例对象进行操作,否则synchronized是没有意义的)的sayHello方法的时候,这个时候只能有一个线程能执行sayHello操作,等当前的线程执行完成后,下一个线程才能拿到锁,执行sayHello操作。
同步方法有两种锁,一种是对象锁,一种是类锁。同步方法中两种锁的区别主要是对象锁没有被static修饰,而类锁被static修饰。
(1)对象锁
public synchronized void sayHello(String name) {
for (int j = 0; j < 5; j++) {
System.out.println(name+"打招呼"+j+"次");
}
}
(2)类锁
public static synchronized void sneeze(String name) {
for (int j = 0; j < 5; j++) {
System.out.println(name+"打喷嚏"+j+"次");
}
}
2)同步块
同步块的synchronized有两种锁,一种称之为对象锁,另一种是类锁。
主要区别是synchronized ()括号里是this还是一个类。如果是this则是对象锁,那么他的作用是多个线程对同一个对象进行的操作同步。如果是一个类,那么他的作用是多个线程对类的所有实例都进行同步。
同步块与同步方法的区别是同步方法是使用synchronized修饰方法的,而同步块是在方法里对某个部分的代码块进行同步。
(1)对象锁:
public void burp(String name) {
synchronized (this) {
for (int j = 0; j < 5; j++) {
System.out.println(name+"打嗝"+j+"次");
}
}
}
(2)类锁:
public void whistle(String name)
{
synchronized (TestObject.class) {
for (int j = 0; j < 5; j++) {
System.out.println(name+"吹口哨"+j+"次");
}
}
}