1.在類中方法上加上
synchronized關鍵字,是對整個對象加鎖,當一個線程訪問帶有synchronized的方法時,其他帶有synchronized的方法的訪問就都會阻塞。
樣例:
public class ThreadTest {
public static void main(String[] args) {
Stu stu = new Stu();
StuThread1 t1 = new StuThread1(stu);
t1.start();
StuThread2 t2 = new StuThread2(stu);
t2.start();
}
}
class StuThread1 extends Thread {
Stu stu;
public StuThread1(Stu stu) {
this.stu = stu;
}
public void run() {
stu.read1();
}
}
class StuThread2 extends Thread {
Stu stu;
public StuThread2(Stu stu) {
this.stu = stu;
}
public void run() {
stu.read2();
}
}
class Stu {
public synchronized void read1() {
System.out.println("read1 begin");
try {
Thread.currentThread()。sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("read1 end");
}
public synchronized void read2() {
System.out.println("read2 begin");
try {
Thread.currentThread()。sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("read2 end");
}
}
打印結果為(兩個線程是順序執行的):
read1 begin
read1 end
read2 begin
read2 end
如果去掉read2前面的synchronized關鍵字,打印為(線程出現了交叉執行):
read1 begin
read2 begin
read2 end
read1 end
修改read2方法,
public void read2() {
synchronized(this)
{
System.out.println("read2 begin");
try {
Thread.currentThread()。sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("read2 end");
}
}
對this進行加鎖,結果同一次,線程是順序執行的托福答案