题目:两个线程,其中一个线程完成对某个对象的int值++操作,另一个线程对该对象的int类型--操作,同时要保证该对象的值不会小于0,不会大于1,该值初始化值为0.
结果为 01010101010101010101……
package com.test; public class ThreadTest { private int number = 0; public synchronized void jia() throws InterruptedException { if (number != 0) { wait(); } number++; System.out.println("jia:"+number); notify(); } public synchronized void jian() throws InterruptedException { if (number == 0) { wait(); } number--; System.out.println("jian:"+number); notify(); } public static void main(String[] args) { ThreadTest tt = new ThreadTest(); Producer p = new Producer(tt); Consumer c = new Consumer(tt); p.start(); c.start(); } } class Producer extends Thread{ ThreadTest tt; public Producer(ThreadTest tt) { this.tt=tt; } @Override public void run() { while(true){ try { tt.jia(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer extends Thread{ ThreadTest tt; public Consumer(ThreadTest tt) { this.tt=tt; } @Override public void run() { while(true){ try { tt.jian(); } catch (InterruptedException e) { e.printStackTrace(); } } } } 输出结果为jian:0
jia:1
jian:0
jia:1
jian:0
jia:1
jian:0
jia:1
jian:0
加启动两个线程,减启动两个线程?
private int number = 0; public synchronized void jia() throws InterruptedException { while (number != 0) { wait(); } number++; System.out.println(Thread.currentThread().getName()+ " jia:"+number); notify();; } public synchronized void jian() throws InterruptedException { while (number == 0) { wait(); } number--; System.out.println(Thread.currentThread().getName()+ " jian:"+number); notify(); }
改成while的话有可能会造成死锁,解决办法为把notify改为notifyAll方法调用。
关于wait,notify,notifyAll以及sleep方法的关系(重点)
(1,如果一个线程调用了某个对象的wait方法,那么该线程首先必须要拥有该对象的锁。(一个线程调用了某个对象的wait方法,那么该wait必须在synchronized中)
(2,如果一个线程调用了某个对象的wait方法,那么该线程就会释放该对象的锁。
(3,在java对象中,有两种池(锁池,等待池)
(4,如果一个线程调用了某个对象的wait方法,那么该线程进入该对象的等待池中(释放锁)如果未来某一时刻,另外一个线程调用了该对象的notify或者notifyAll方法,那么在该等待池中的等待的线程就会进入该对象的锁池中,去等待该对象的锁,如果或得锁成功后,那么该线程将继续沿着wait方法之后的路径去执行。
(5,sleep 睡眠,不释放锁