[javaSE] 并发编程(线程间通信)详解编程语言

新建一个资源类Resource

定义成员变量String name

定义成员变量int age

 

新建一个输入类Input,实现Runnable接口

定义一个构造方法Input(),传入参数:Resource对象

实现run()方法

定义while(true)Resuorce对象的属性赋值

 

 

新建一个输出类Output,实现Runnable接口

定义一个构造方法Output(),传入参数:Resource对象

实现run()方法

定义while(true)打印Resuorce对象的属性

 

 

main方法中

获取Resource对象,new出来

获取Input对象,new出来,构造参数:Resource对象

获取Output对象,new出来,构造参数:Resource对象

获取Thread对象,new出来,构造参数:Runnable对象

调用Thread对象的start()方法,开启线程

 

此时会有线程安全问题,查看结果可以发现,汉字和拼音的混了

陶士涵=====

taoshihan=====nan

陶士涵=====nan

陶士涵=====nan

陶士涵=====

陶士涵=====

陶士涵=====nan

陶士涵=====nan

taoshihan=====nan

taoshihan=====nan

 

使用synchronized(){}同步代码块包裹操作同一个资源的地方

注意同步线程的个数,所有的线程都应该加上

注意是否是同一个锁,synchronized()括号内的锁参数:保证是个唯一的资源

使用synchronized(){}包裹上面的赋值和打印,锁:Resource对象(唯一的)

 

查看结果,此时没有安全问题

陶士涵=====

陶士涵=====

陶士涵=====

taoshihan=====nan

taoshihan=====nan

taoshihan=====nan

 

死锁问题:同步中嵌套同步,并且锁不一致,此时会造成死锁问题

/** 
 * 资源 
 *  
 * @author taoshihan 
 *  
 */ 
class Resource { 
    String name; 
    String sex; 
} 
 
/** 
 * 输入 
 *  
 * @author taoshihan 
 *  
 */ 
class Input implements Runnable { 
    private Resource resource; 
 
    public Input(Resource resource) { 
        this.resource = resource; 
    } 
 
    @Override 
    public void run() { 
        // 切换 
        boolean flag = true; 
        while (true) { 
            synchronized (resource) { 
                if (flag) { 
                    resource.name = "taoshihan"; 
                    resource.sex = "nan"; 
                } else { 
                    resource.name = "陶士涵"; 
                    resource.sex = "男"; 
                } 
                flag = !flag; 
            } 
        } 
    } 
 
} 
 
/** 
 * 输出 
 *  
 * @author taoshihan 
 *  
 */ 
class Output implements Runnable { 
    private Resource resource; 
 
    public Output(Resource resource) { 
        this.resource = resource; 
    } 
 
    @Override 
    public void run() { 
        while (true) { 
            synchronized (resource) { 
                System.out.println(resource.name + "=====" + resource.sex); 
            } 
        } 
    } 
 
} 
 
public class InputOutputDemo { 
 
    /** 
     * @param args 
     */ 
    public static void main(String[] args) { 
        Resource resource = new Resource(); 
        Input input = new Input(resource); 
        Output output = new Output(resource); 
 
        Thread t1 = new Thread(input); 
        Thread t2 = new Thread(output); 
        t1.start(); 
        t2.start(); 
    } 
 
}

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/12678.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论