美文网首页
并发编程-同步与锁

并发编程-同步与锁

作者: slientopen | 来源:发表于2018-03-07 11:38 被阅读0次

概念

在并发编程开发过程中,如果多个线程共享一块资源,就会产生竞争条件,考虑安全性,需要同步机制保证代码能够正确执行,保证任何时刻,只能有一个线程占有锁和执行同步代码块,没有获取到锁的线程存放在等待队列中。

实现方式

  • synchronized关键字修饰需要同步的方法和对象
  • Lock锁机制实现同步
  • 原子变量实现同步

synchronized

可以作为修饰符,也可以作为语句,即可以同步代码块,也可以同步方法。但获得的都是对象锁,每个对象只能有一个锁。

案例

//共享对象
public class Synch {
     int count = 0;

    public  void increse() throws InterruptedException {
        TimeUnit.MILLISECONDS.sleep(1000);
        count++;
        System.out.println(count);
    }
}
//调用
public class SynchDemo {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        Synch synch = new Synch();
        for(int i=0;i<10;i++){
            executorService.execute(()->{
                try {
                    synch.increse();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        executorService.shutdown();
    }
}


Synch类没有加synchronized修饰时,返回的结果为


A6E2E747-DD8D-4F44-B594-560D3CD365DC.png

Synch类加synchronized修饰时,返回的结果为


5A443BCB-67CF-434D-8E2C-1809E22D4B04.png
public class LockSynch {

    private AtomicInteger increase = new AtomicInteger(0);

    private ReentrantLock lock = new ReentrantLock();

    public void increase()  {
        try {
            //lock.lock();
            Thread.sleep(1000);
            int number = increase.incrementAndGet();
            System.out.println(number);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            //lock.unlock();
        }

    }
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        LockSynch lockSynch = new LockSynch();
        for(int i=0;i<10;i++){
            executorService.execute(new Runnable(){
                @Override
                public void run() {
                    lockSynch.increase();
                }
            });
        }
    }
}

注:通过原子变量保证线程同步,但不保证线程的执行顺序。

相关文章

  • 并发编程中必须知道的几个概念

    并发编程中下面的这些概念是非常关键的: 同步与异步 并行与并发 临界区 阻塞与非阻塞 死锁、活锁与饥饿 1. 同步...

  • 并发编程-同步与锁

    概念 在并发编程开发过程中,如果多个线程共享一块资源,就会产生竞争条件,考虑安全性,需要同步机制保证代码能够正确执...

  • 并发编程-锁与线程同步

    多线程同步 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改...

  • 并发编程之临界区\阻塞\非阻塞\死锁\饥饿\活锁

    本文介绍并发编程中的若干概念,实际上在笔者之前的文章中,已经介绍过很多概念。比如:并发与并行、同步与异步、锁与信号...

  • 并发编程03-Java内存模型03(锁的内存语义)

    锁的内存语义 锁的释放-获取建立的happens-before关系 锁是Java并发编程中最重要的同步机制.锁除了...

  • 关于并发编程的博客收藏

    Android并发编程 开篇http://ddrv.cn/a/23502/ Android并发编程 多线程与锁ht...

  • 并发编程实战学习

    目录 线程风险 线程风险预防 线程安全设计 并发工具 显示锁 构建自定义的同步工具 java内存模型 并发编程 线...

  • java并发

    1.并发编程中的锁 并发编程中的各种锁java高并发锁的3种实现Java并发机制及锁的实现原理 2.线程池核心线程...

  • 线程同步与互斥

    Linux--线程编程 多线程编程-互斥锁 线程同步与互斥 互斥锁 信号量 条件变量 互斥锁 互斥锁的基本使用...

  • Java并发编程(锁,线程同步)

    java中为什么notify()可能会导致死锁,而notifyAll()则不会 为什么volatile关键字保证不...

网友评论

      本文标题:并发编程-同步与锁

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