示例代码(Android工程)
先点击按钮thread_A_start
,再点击thread_B_start
,过一会儿点击release_lock
public class MainActivity extends AppCompatActivity {
private final Object mLock = new Object();
private volatile boolean f = true;
private final static String TAG = "ThreadApp";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Runnable lockThread = () -> {
f = true;
synchronized (mLock) {
int count = 0;
while (f) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "Count: " + ++count);
}
}
};
final Runnable visitThread = () -> {
Log.d(TAG, "Thread B Start");
synchronized (mLock) {
Log.d(TAG, "Get lock success.");
}
};
findViewById(R.id.thread_A_start).setOnClickListener(v -> new Thread(lockThread).start());
findViewById(R.id.thread_B_start).setOnClickListener(v -> new Thread(visitThread).start());
findViewById(R.id.release_lock).setOnClickListener(v -> f = false);
}
}
解析
先启动线程A,使其占有对象mLock
的锁,然后启动线程B,此时线程B的同步代码块获取不到mLock
的锁,因此线程B会阻塞。最后执行release_lock操作,使线程A释放掉mLock
的锁,释放后线程B获得到mLock
的锁,于是线程B获得执行权。