精华内容
下载资源
问答
  • 主要介绍了Java实现线程同步方法及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 关于java实现线程同步的方式有哪些当使用多个线程来访问同一个数据时,非常容易出现线程安全问题,所以我们用同步机制来解决这些问题。那么,java实现线程同步的方式有哪些?下面百分网小编带大家一起来看看详细内容...

    关于java实现线程同步的方式有哪些

    当使用多个线程来访问同一个数据时,非常容易出现线程安全问题,所以我们用同步机制来解决这些问题。那么,java实现线程同步的方式有哪些?下面百分网小编带大家一起来看看详细内容,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网!

    什么是线程同步?

    当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。

    实现同步机制有两个方法:

    1。同步代码块:

    synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。

    2。同步方法:

    public synchronized 数据返回类型 方法名(){}

    就是使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是 this 也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:

    1,该类的对象可以被多个线程安全的访问。

    2,每个线程调用该对象的任意方法之后,都将得到正确的结果。

    3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态。

    注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。

    实现同步机制注意以下几点: 安全性高,性能低,在多线程用。性能高,安全性低,在单线程用。

    1,不要对线程安全类的所有方法都进行同步,只对那些会改变共享资源方法的进行同步。

    2,如果可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块)。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.

    线程通讯:

    为什么要使用线程通讯?

    当使用synchronized 来修饰某个共享资源时(分同步代码块和同步方法两种情况),当某个线程获得共享资源的锁后就可以执行相应的代码段,直到该线程运行完该代码段后才释放对该 共享资源的锁,让其他线程有机会执行对该共享资源的修改。当某个线程占有某个共享资源的锁时,如果另外一个线程也想获得这把锁运行就需要使用wait() 和notify()/notifyAll()方法来进行线程通讯了。

    Java.lang.object 里的三个方法:wait() notify() notifyAll()

    wait方法导致当前线程等待,直到其他线程调用同步监视器的`notify方法或notifyAll方法来唤醒该线程。

    wait(mills)方法

    都是等待指定时间后自动苏醒,调用wait方法的当前线程会释放该同步监视器的锁定,可以不用notify或notifyAll方法把它唤醒。

    notify()

    唤醒在同步监视器上等待的单个线程,如果所有线程都在同步监视器上等待,则会选择唤醒其中一个线程,选择是任意性的,只有当前线程放弃对该同步监视器的锁定后,也就是使用wait方法后,才可以执行被唤醒的线程。

    notifyAll()方法

    唤醒在同步监视器上等待的所有的线程。只用当前线程放弃对该同步监视器的锁定后,才可以执行被唤醒的线程

    【关于java实现线程同步的方式有哪些】相关文章:

    展开全文
  • 3.使用特殊域变量(volatile)实现线程同步。 4.使用互斥锁ReentrantLock实现线程同步。 5.使用局部变量实现线程同步。如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立...

    1.使用同步方法,即有synchronized关键字修饰的方法。

    2.使用同步代码块,即有synchronized关键字修饰的语句块。

    3.使用volatile特殊域变量实现线程同步。

    4.使用ReentrantLock可重入锁实现线程同步。

    5.使用局部变量实现线程同步。如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的一个副本,副本之间相互独立,这样每一个线程都可以随意修改自己的副本变量,而不会对其他线程产生影响。

    6.使用阻塞队列实现线程同步。

    7.使用原子变量实现线程同步。

    展开全文
  • java 实现线程同步的方式有哪些 转自:http://www.jb51.net/article/32245.htm 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题,所以我们用同步机制来解决这些问题,本文将详细介绍,需要的朋友可以...

    java 实现线程同步的方式有哪些
    转自:http://www.jb51.net/article/32245.htm
    当使用多个线程来访问同一个数据时,非常容易出现线程安全问题,所以我们用同步机制来解决这些问题,本文将详细介绍,需要的朋友可以参考下
    什么是线程同步?
    当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。

    实现同步机制有两个方法:
    1。同步代码块:
    synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。
    2。
    同步方法:
    public synchronized 数据返回类型 方法名(){}
    就是使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是 this 也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:
    1,该类的对象可以被多个线程安全的访问。
    2,每个线程调用该对象的任意方法之后,都将得到正确的结果。
    3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态。
    注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。
    实现同步机制注意以下几点: 安全性高,性能低,在多线程用。性能高,安全性低,在单线程用。
    1,不要对线程安全类的所有方法都进行同步,只对那些会改变共享资源方法的进行同步。
    2,如果可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块)。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.

    线程通讯:
    为什么要使用线程通讯?
    当使用synchronized 来修饰某个共享资源时(分同步代码块和同步方法两种情况),当某个线程获得共享资源的锁后就可以执行相应的代码段,直到该线程运行完该代码段后才释放对该 共享资源的锁,让其他线程有机会执行对该共享资源的修改。当某个线程占有某个共享资源的锁时,如果另外一个线程也想获得这把锁运行就需要使用wait() 和notify()/notifyAll()方法来进行线程通讯了。
    Java.lang.object 里的三个方法wait() notify() notifyAll()
    wait方法导致当前线程等待,直到其他线程调用同步监视器的notify方法或notifyAll方法来唤醒该线程。
    wait(mills)方法
    都是等待指定时间后自动苏醒,调用wait方法的当前线程会释放该同步监视器的锁定,可以不用notify或notifyAll方法把它唤醒。
    notify()
    唤醒在同步监视器上等待的单个线程,如果所有线程都在同步监视器上等待,则会选择唤醒其中一个线程,选择是任意性的,只有当前线程放弃对该同步监视器的锁定后,也就是使用wait方法后,才可以执行被唤醒的线程。
    notifyAll()方法
    唤醒在同步监视器上等待的所有的线程。只用当前线程放弃对该同步监视器的锁定后,才可以执行被唤醒的线程

    展开全文
  • 实现线程同步的原因: java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时, 会产生冲突,使得变量值不唯一,因此我们需要加入同步锁来避免在当前线程的操作未完成前,其它线程改变共享资源值...

    要实现线程同步的原因:
    java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时,
    会产生冲突,使得变量值不唯一,因此我们需要加入同步锁来避免在当前线程的操作未完成前,其它线程改变共享资源值的情况发生,从而保证变量的唯一
    性和准确性

    方法

    • synchronized
      synchronized可以修饰方法,但是由于同步本身就是一种高开销的操作,因此我们应该尽可能的减少同步的内容,提高性能
      使用同步代码块,下面的方式
     synchronized (this){
                        if (account.getBalance() > money) {
                            System.out.println(Thread.currentThread().getName() + "取钱" + money + "成功");
                        try {
                            Thread.sleep(1);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                            account.reduceBalance(money);
                            System.out.println("\t" + Thread.currentThread().getName() + "成功后的余额: " + account.getBalance());
                        } else {
                            System.out.println(Thread.currentThread().getName() + "取钱失败");
                            System.out.println("\t" + Thread.currentThread().getName() + "失败后的余额: " + account.getBalance());
                            break;
                        }
                    }
    • volatile
      volatile关键字保证了每个线程所取得的共享资源变量的值是一样的,它的原理是被volatile修饰的变量被访问时,都会从内存中读取,而不是从缓存(寄存器)中,这样保证了每个线程访问到的变量值的一致性
      但是他不会保证操作的原子性,
     private volatile double balance;
    • java.util.concurrent包下的ReentrantLock类
      使用的方法
    //需要声明这个锁
    private Lock lock = new ReentrantLock();
    
    // 存钱
    public void addMoney(int money) {
    lock.lock();//上锁
    try{
    count += money;
    System.out.println(System.currentTimeMillis() + "存进:" + money);
    
    }finally{
    lock.unlock();//解锁
    }
    }

    Lock与Synchronized的对比:
    主要相同点:Lock能完成Synchronized所实现的所有功能。
    主要不同点:Lock有比Synchronized更好的性能。Synchronized会自动释放锁,但是Lock一定要求程序员手工释放,并且必须在finally从句中释放。
    synchronized 修饰方法时 表示同一个对象在不同的线程中 表现为同步队列
    如果实例化不同的对象 那么synchronized就不会出现同步效果了。
    这个地方不理解可以看这篇博文
    https://blog.csdn.net/jzy23682891/article/details/7197115

    • ThreadLocal
      如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。现在明白了吧,原来每个线程运行的都是一个副本,也就是说存钱和取钱是两个账户,知识名字相同而已。
      这样的话当操作不一致的时候,就无法解决问题,会出现下面的结果
    public class Bank {
    
    private static ThreadLocal<Integer> count = new ThreadLocal<Integer>(){
    @Override
    protected Integer initialValue() {
    // TODO Auto-generated method stub
    return 0;
    }
    
    };
    // 存钱
    public void addMoney(int money) {
    count.set(count.get()+money);
    System.out.println(System.currentTimeMillis() + "存进:" + money);
    
    }
    
    // 取钱
    public void subMoney(int money) {
    if (count.get() - money < 0) {
    System.out.println("余额不足");
    return;
    }
    count.set(count.get()- money);
    System.out.println(+System.currentTimeMillis() + "取出:" + money);
    }
    
    // 查询
    public void lookMoney() {
    System.out.println("账户余额:" + count.get());
    }
    }
    package threadTest;
    
    
    public class SyncThreadTest {
    
    public static void main(String args[]){
    final Bank bank=new Bank();
    
    Thread tadd=new Thread(new Runnable() {
    
    @Override
    public void run() {
    // TODO Auto-generated method stub
    while(true){
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    bank.addMoney(100);
    bank.lookMoney();
    System.out.println("\n");
    
    }
    }
    });
    
    Thread tsub = new Thread(new Runnable() {
    
    @Override
    public void run() {
    // TODO Auto-generated method stub
    while(true){
    bank.subMoney(100);
    bank.lookMoney();
    System.out.println("\n");
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    });
    tsub.start();
    
    tadd.start();
    }
    }

    结果:

    余额不足
    账户余额:0
    
    
    余额不足
    1502547748383存进:100
    账户余额:100
    账户余额:0
    
    
    
    
    余额不足
    账户余额:0
    
    
    1502547749383存进:100
    账户余额:200

    用例参考:
    https://www.cnblogs.com/jiansen/p/7351872.html

    展开全文
  • Java实现线程同步的几种方式?

    千次阅读 2019-01-16 00:24:05
    二、Java实现同步的几种方式 //通过加synchronized关键字实现多个线程同时访问共享资源时出现的问题,当有申请者申请该资源时,如果资源没有被占用,就给这个申请者使用,否则不能使用该资源。 1.synchronized...
  • 一.使用synchronized关键字 由于每个java对象都有一个内置锁,用synchronized修饰方法或者代码块时...由于同步是一种高开销的工作,所以尽量减少同步的内容,只需同步代码块就可以。 1.修饰方法 在这里插入代码片 ...
  • 实现同步的三种方法 多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步实现同步的三种方法: 使用同步代码块 使用同步方法 使用互斥锁ReetrantLock(更灵活的代码控制) 锁:同步监视器,...
  • java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证...
  • 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多,具体如下。 (1)synchronized关键字  在Java中内置了语言级的同步原语synchronized
  • import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Test{ static Scanner sc = new Scanner(System.in); static
  • 下面我们来全面介绍一下这些:线程同步实现:1.使用synchronized关键字同步方法即有synchronized关键字修饰的方法。由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法...
  • java多线程有几种实现方法,...3.使用特殊域变量(volatile)实现线程同步;4.使用重入锁实现线程同步;5.使用局部变量实现线程同步JAVA多线程有哪几种实现方式JAVA多线程实现方式主要有三种:继承Thread类、实现Ru...
  • Java 多线程 系列文章目录: Java 多线程(一)线程间的互斥和同步通信 Java 多线程(二)同步线程分组问题 ... Java 多线程(五)Lock 和 Condition 实现线程同步通信 Java 多线程(六)Semaphore 实...
  • java如何实现线程同步

    2020-09-14 09:30:19
    但是当多个线程同时读写同一份共享资源的时候,会引起冲突,例如在多个线程同时对同一个内存地址进行写入,由于CPU时间调度上的问题,写入数据会被多次的覆盖,所以就要使线程同步。这时候就需要引入线程同步机制使...
  •  在之前的文章《Java的Thread类的两种实现方式的区别》中,我们发现,通过实现Runnable接口创建的线程可能会出现被共享的资源,被多个线程同时操作,并导致数据不准确的现象,那我们怎么去保护我们的敏感数据的,...
  • 一、synchronized关键字Synchronized修饰整个方法java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类...
  • 2月 14, 2015 |Nix.Huang1)使用synchronized关键字java中的每个对象都有一个monitor对象,当使用synchronized关键字来同步一段代码时,java提供monitorenter和monitorexit两个字节码指令来支持同步操作,...
  • 线程同步是防止多个线程访问一个数据对象时,对数据造成的破坏) 在Java虚拟机中,监视器和锁是一块使用的。每个对象通过某种逻辑关联监视器,且为了实现监视器的互斥功能,每个对象都关联着一把锁。一旦对象被...
  • Java实现线程同步的三种方法 实现同步的三种方法 多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步。 实现同步的三种方法: 使用同步代码块 使用同步方法 使用互斥锁ReetrantLock(更灵活...
  • 主要介绍了Java实现线程同步五种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • java线程实现火车售票系统 以及java中的同步实现 同步块 和同步方法同时 同步 ? /* 利用Java线程模拟火车站售票系统? 了解java中的同步 class? Test { ?public? static void main(String []args) ?{? ? ...
  • 在线程出现安全问题时我们就要用到线程同步,那如何实现线程同步大家知道吗?它又有几种实现方法呢?一起来看看吧。一、什么是线程同步?多个线程在访问同一个数据时,会出现可能线程安全问题,线程同步就是用来解决这些...
  • 展开全部线程同步62616964757a686964616fe4b893e5b19e31333365653330主要有以下种方法(示例中是实现计数的功能):1、同步方法,即使用synchronized关键字修饰方法,例如:publicsynchronizedvoidadd(intc){...}2、...
  • Java用同步代码块实现线程同步: 本文示例卖票的,三张票,四个窗口出售 testsale1为四个线程处理同一个对象,sale1内有两个方法,可供run方法调用,一个是未使用同步代码块的方法,一个是使用同步代码块的方法 ...
  • JAVA多线程实现线程同步总结

    千次阅读 2013-10-08 19:52:52
    1.JAVA线程实现方式 JAVA线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,491
精华内容 6,996
关键字:

java实现线程同步

java 订阅