| 不一定的,并发线程中与共享变量有关的程序段称为临界区。学习毕老师的视频后,我们知道java中用关键字synchronized声明一段临界区,只要该为临界区加的是同一把锁就可以实现同步的,这里是我写过的代码,读者和写者问题,经典的同步问题。请认真看下吧,希望能帮到你哦。 复制代码/**
 * 题目:用多线程同步思想实现对某个共享缓冲区的读写操作的设计,即一旦写入数据,马上读走。
 * 线程同步,说白了,强调的是先后次序,也就是说必须等我这边忙完了,你那边才开始。
 * */
public class ReaderAndWrite {
        public static void main(String[] args) {
                
                Buffer buffer = new Buffer();
                String[] datas = {"张三","李四","王五","赵六"};
                new writer(buffer,datas).start();
                new Reader(buffer,datas).start();
        }
}
class Buffer{
        private String data;
        private boolean isNull = true;//读写线程通信的信号量,true表示缓冲区为空,可写
        public  void putData(String data){
                while (!isNull) {//等待isNull为true,即等待数据被读走
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                this.data = data;//此时isNull为true,即前一个数据已被取走
                isNull = false;//将信号量设为false,表示缓冲区不为空,用以通知读进程
                notify();//唤醒等待的读线程,以进行读取刚刚存入的数据
        }
        
        public  String getData(){
                while (isNull) {//此时若isNull为true,即无数据,则等待isNull为false,即等待写入数据
                        
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                isNull = true;//将信号量设为true,表示缓冲区为空,用以通知写进程
                notify();//唤醒等待的写线程,以进行写操作
                return data;//有数据则返回当前数据
        }
}
class writer extends Thread{
        private Buffer buffer;
        private String[] datas;
        public writer(Buffer buffer,String[] datas) {
                this.buffer = buffer;
                this.datas = datas;
        }
        public  void run(){        
                //很明显,涉及到缓冲区,则可以将表示缓冲区的共享变量设为锁
                synchronized (buffer) {
                        for(int i = 0;i<datas.length;i++){
                                buffer.putData(datas[i]);
                                System.out.println("写入:"+datas[i]);        
                        }
                }
        }
}
class Reader extends Thread{
        private Buffer buffer;
        private String[] datas;
        public Reader(Buffer buffer,String[] datas) {
                this.buffer = buffer;
                this.datas = datas;
        }
        public void run(){
                //使用与写操作相同的缓冲区,则设置同一把锁
                synchronized (buffer) {
                        for(int i = 0;i<datas.length;i++){
                                System.out.println("读取:"+buffer.getData());        
                        }
                }
        }
}
 |