美文网首页
Java多线程同步

Java多线程同步

作者: BigBug77 | 来源:发表于2017-02-04 18:21 被阅读0次
synchronized关键字
  • synchronized关键字修饰函数方法
    使用synchronized关键字时,会获取java对象的内置锁,内置锁会保护整个方法。
public synchronized void add(){
    count++;
}

synchronized也可以修饰静态方法,内置锁会锁住整改类。

  • synchronized关键字修饰代码块
    synchronized可以修饰代码块,只锁住需要保护的代码区域
public class SynchronizedThread {
    public void add(){
        synchronized(this)
        {
            count++;
        }
     }
}

synchronized是一种高开销操作,实际应用不需要锁住整个方法,可以使用同步代码块操作。

使用特殊域变量

使用volatile关键字修饰变量,没有锁同步开销,每次使用变量时需要重新计算,不会直接使用寄存器的值,此变量不是原子操作,不可以修饰final对象。

public class SynchronizedThread{
    private volatile int count= 0;
    public void add(){
        count++;
    }
}
使用原子变量实现线程同步

在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,使用该类可以简化线程同步。

public class SynchronizedThread{
    private AtomicInteger count= new AtomicInteger(0);
    public void add(){
        count.addAndGet(1);
    }
}

原子操作适合线程简单对象的计算。

使用重入锁实现线程同步

在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。

public class SynchronizedThread{
    private int count= 0;
    private Lock lock = new ReentrantLock();
    public void add(){
        lock.lock();
        try{
             count++;
        }finally{
             lock.unlock();
        }
    }
}

使用try模块语句,在finally模块中释放锁,防止死锁。
ReentrantLock类可以构造公平锁,每个线程阻塞相同的时间,但由于能大幅度降低程序运行效率,不推荐使用。

使用局部变量实现线程同步

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

public class SynchronizedThread{
    private static ThreadLocal<Integer> count= new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue(){
            return 0;
        }
    };
    public void add(){
        count.set(count.get()+1);
    }
}
使用阻塞队列实现线程同步

前面5种同步方式都是在底层实现的线程同步,但是我们在实际开发当中,应当尽量远离底层结构。 使用javaSE5.0版本中新增的java.util.concurrent包将有助于简化开发。 本小节主要是使用LinkedBlockingQueue<E>来实现线程的同步。

public class BlockingSynchronizedThread {
    private LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>();
    private class LinkBlockThread implements Runnable {
        @Override
        public void run() {
            try {
                int n = queue.take();
                System.out.println(n);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

相关文章

  • 5月份第一周学习安排

    学习内容: java多线程及线程同步的方法(使用) java多线程各种同步方法的原理和优缺点 java多线程设计模...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

  • 线程池

    Java多线程 线程的同步是Java多线程编程的重点和难点,往往让人搞不清楚什么是竞争资源、什么时候需要考虑同步,...

  • Java之同步代码块

    Java多线程的同步代码块 synchronized(对象){ 需要同步的代码 } 同步代码块可以解决安全...

  • Java自学-多线程 同步synchronized

    Java 多线程同步 synchronized 多线程的同步问题指的是多个线程同时修改一个数据的时候,可能导致的问...

  • 锁与多线程同步的实现

    Java当中的锁都是为了保证多线程同步执行。如果没有锁的话,多线程是异步执行的。 什么是多线程同步? 请看下面的代...

  • Java并发编程(二)同步

    如果你的java基础较弱,或者不大了解java多线程请先看这篇文章java多线程(一)线程定义、状态和属性 同步一...

  • 关于Java里面多线程同步的一些知识

    # 关于Java里面多线程同步的一些知识 对于任何Java开发者来说多线程和同步是一个非常重要的话题。比较好的掌握...

  • 2.安全性

    java中多线程同步包括: synchronized 显示锁 volatile 原子变量 之所以要使用同步,是因为...

  • Java并发之synchronized

    Java多线程同步关键词是常用的多线程同步手段。它可以修饰静态类方法,实例方法,或代码块。修饰static静态方法...

网友评论

      本文标题:Java多线程同步

      本文链接:https://www.haomeiwen.com/subject/mcfsittx.html