java 第59节 同步问题Java的解决方案

2016-07-02

1 同步问题Java的解决方案
同步方法:当线程进入同步方法的时候,会获得同步方法所属对象的锁,
一旦获得对象锁,则其他线程不能再执行被锁对象的其他任何同步方法。
只有在同步方法执行完毕之后释放了锁,其他线程才能继续执行。

synchronized 方法声明{

}

同步块:
synchronized(资源对象){
//需要进行同步的方法
}

package com.java1995;

/**
 * 打印机类
 *
 * @author Administrator
 *
 */
public class Print {

    /**
     *
     * @param name
     *            学生姓名
     * @param eScore
     *            英语成绩
     * @param mScore
     *            数学成绩
     * @param yScore
     *            语文成绩
     */
    public void printScore(String name, int eScore, int mScore, int yScore) {
        System.out.println(name + "的英语成绩:" + eScore);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(name + "的数学成绩:" + mScore);
        System.out.println(name + "的语文成绩:" + yScore);

    }

}
package com.java1995;
/**
 * 老师类
 * @author Administrator
 *
 */
public class Teacher implements Runnable{
    //封装
    private Print p;
    private String name;
    private int eScore,mScore,yScore;

    public Teacher(Print p,String name,int eScore,int mScore,int yScore){
        this.p=p;
        this.name=name;
        this.eScore=eScore;
        this.mScore=mScore;
        this.yScore=yScore;
    }

    //封装的实现
    public Print getP() {
        return p;
    }

    public void setP(Print p) {
        this.p = p;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int geteScore() {
        return eScore;
    }

    public void seteScore(int eScore) {
        this.eScore = eScore;
    }

    public int getmScore() {
        return mScore;
    }

    public void setmScore(int mScore) {
        this.mScore = mScore;
    }

    public int getyScore() {
        return yScore;
    }

    public void setyScore(int yScore) {
        this.yScore = yScore;
    }

    //重写run()方法
    @Override
    public void run() {
        // TODO Auto-generated method stub
        synchronized (p) {

            p.printScore(name, eScore, mScore, yScore);
        }
    }

}
package com.java1995;

public class Test {

    public static void main(String[] args) {

        Print p = new Print();
        Teacher t1 = new Teacher(p, "博尔特", 10, 11, 12);
        Teacher t2 = new Teacher(p, "加特林", 23, 56, 1);
        Teacher t3 = new Teacher(p, "苏炳添", 34, 55, 90);

        Thread th1 = new Thread(t1);
        Thread th2 = new Thread(t2);
        Thread th3 = new Thread(t3);
        th1.start();
        th2.start();
        th3.start();

    }

}

package com.java1995;

public class Source {

    synchronized void method1(){
        System.out.println("进入method1方法,获得锁");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("method1执行完毕,释放锁");
    }

    synchronized void method2(){
        System.out.println("进入method2方法,获得锁");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("method2执行完毕,释放锁");
    }

}
package com.java1995;

public class MyThread extends Thread{

    String name;
    Source s;

    MyThread(String name,Source s){
        this.name=name;
        this.s=s;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        if("method1".equals(name)){
            s.method1();
        }else{
            s.method2();
        }
    }

    public static void main(String[] args) {
        Source s=new Source();
        MyThread t1=new MyThread("method1",s);
        MyThread t2=new MyThread("method2",s);
        t1.start();
        t2.start();
    }

}

【参考资料】

[1] Java轻松入门经典教程【完整版】

时间: 2024-08-19 05:17:13

java 第59节 同步问题Java的解决方案的相关文章

Java笔记——关于线程同步

关于线程同步(7种方式) 转载地址"http://www.cnblogs.com/XHJT/p/3897440.html" 为何要使用同步?     java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),     将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,     从而保证了该变量的唯一性和准确性. 1.同步方法     即有synchronized关键字修饰的方法.     由于java的

java的线程问题同步与互斥

以前学过java的线程,但是当时对Tread的理解不是很深,对于里面的同步与互斥,生产者与消费者问题,理解的不够深入,这次又从新学习java的多线程,感觉对线程的理解更加的深入了,觉得有必要写下博客记录下. 本文原创,转载请著明:http://blog.csdn.net/j903829182/article/details/38420503 1.java实现线程的方法: 1.实现Runnable接口,重写run方法,通过Thread的start方法启动线程.这种方法可以实现资源的共享 2.继承T

java学习之协调同步的线程

当一个线程使用的同步方法中用到某个变量,而此变量有需要其他线程修改后才能符合本线程的需要, 那么可以在同步方法中使用wait(),wait方法可以中断线程的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法. 其他线程如果在使用这个同步方法时,不许需要等待,那么它使用这个同步方法.其他线程如果再使用这个同步方法是不需要等待,那么它使用完 这个同步方法的同时,应当用notifyAll()方法通知所有由于使用这个同步方法而处于等待的线程结束等待.曾中断的线程就会从刚才的中断处

关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文)

Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享给大家. 一.对于线程同步和同步锁的理解(注:分享了三篇高质量的博客) 以下我精心的挑选了几篇博文,分别是关于对线程同步的理解和如何选择线程锁以及了解线程锁的作用范围. <一>线程同步锁的选择 1. 这里我推荐下Java代码质量改进之:同步对象的选择这篇博文. 2. 以上推荐的博文是以卖火车票为例

Java深度历险(三)——Java线程?:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的话,就

疯狂Java学习笔记(59)-----------50道Java线程面试题

50道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点.欲了解更多详细信息请点击这里. 2) 线程和进程有什么区别? 线程是进程的子集,一个

Java线程:线程的同步与锁

1.同步和锁 java中每个对象都有一个内置锁,程序执行非静态的synchronized同步方法时,自动获得执行该方法的对象有关的锁. 一个对象只有一个锁,当一个线程获得锁,其他线程不能进入该对象上的synchronized方法或代码块.直到锁被释放. 线程可以有多个锁,例如,一个对象的同步方法中调用另一个对象的同步方法 2.静态方法的同步 同步静态方法,用的是类对象的锁,即xx.class. 3.线程安全类 对类中的方法进行了同步,但操作这个类时仍然不一定安全. 例如: public  cla

java笔记--关于线程同步(5种同步方式)

转自:http://www.2cto.com/kf/201408/324061.html 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证了该变量的唯一性和准确性. 1.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法

Java多线程基础(四)Java传统线程同步通信技术

Java多线程基础(四)Java传统线程同步通信技术 编写代码实现以下功能 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次. 分析 1)子线程循环10次与主线程循环100次必须是互斥的执行,不能出现交叉,下面代码中通过synchronized关键字实现此要求: 2)子线程与主线程必须交替出现,可以通过线程同步通信技术实现,下面代码中通过bShouldSub变量实现此要求: 其他需要注意的地方 1)其中business变量必须声