感觉你思路有点混乱.
在你的代码中自始至终就一个锁new MyCode()- 分析下你的代码:
- public class ThreadTest {
- public static void main(String[] args) {
- final MyCode mc = new MyCode();
-
- //开启了两个线程
- new Thread() {
- public void run() {
- while (true)
- try {
- mc.print1(); //Thread-0执行print1代码
- } catch (InterruptedException e) {
-
- }
- }
- }.start();
-
- new Thread() {
- public void run() {
- while (true)
- try {
- mc.print2(); //Thread-1执行print2代码
- } catch (InterruptedException e) {
-
- }
- }
- }.start();
- }
- }
- class MyCode {
- int flag = 1;
- /*
- CPU切换Thread-0首先进入同步函数持有this锁(那么此时即使CPU切换到Thread-1,它无法执行print2,因为它没有this锁)
- 在进入同步代码块你这里依然用的this锁
- 同一把锁,Thread-0依然可以进入执行.
- 在这里的同步嵌套用的同一个锁,那么里面同步代码块有和没有在这里没有区别,只不过再次判断了下原锁
- */
- public synchronized void print1() throws InterruptedException {
- synchronized(this) {
- if (flag != 1)
- wait();
- System.out.print("C");
- System.out.print("S");
- System.out.print("D");
- System.out.print("N");
- System.out.print("\r\n");
- notify();
- flag = 2;
- }
- }
- public void print2() throws InterruptedException {
- synchronized(this) {
- if (flag != 2)
- wait();
- System.out.print("黑");
- System.out.print("马");
- System.out.print("程");
- System.out.print("序");
- System.out.print("员");
- System.out.print("\r\n");
- notify();
- flag = 1;
- }
- }
- }
- /*
- 关于死锁:
- 在操作系统中解释:(大同小异)
- 所谓死锁,是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
- 假如有一双筷子,每支筷子(a,b)相当于一把锁,2个人p1,p2(两个线程)
- p1持有a,为了吃饭(为了向下执行),索要b
- p2持有b,同上,索要a
- 这时候,两者互不相让发生死锁.
- 但是有一种很和谐情况:p1持有了a,再持有b->吃完饭(执行完)->释放了a,b->p2持有a,在持有b->执行完.....
- */
复制代码 |