资讯专栏INFORMATION COLUMN

线程的同步

wind5o / 2520人阅读

摘要:线程是程序执行中的最小单元,依赖进程存在。线程的同步可以理解为该线程在未返回结果之前你处于阻塞状态。

WHAT

线程是程序执行中的最小单元,依赖进程存在。线程的同步可以理解为该线程在未返回结果之前你处于阻塞状态。

WHY

在JAVA多线程并发中,当多个线程同时操作一个共享资源时,可能会发生资源数据的不准确,或者是数据的冲突,为了避免此类情况的发生,需要在一个线程操作该资源时,将该资源锁定,使得其他线程不可对此资源进行操作,以保证资源数据的准确性。

HOW
1.同步方法

使用synchronized关键字修饰的方法,如:
public synchronized void save(){}

2.同步代码块

使用synchronized关键字修饰的语句块,如:
synchronized(object){}

3.使用特殊域变量(volatile)

 //需要同步的变量加上volatile
 private volatile int account = 100;

4.使用重入锁

 class Bank {

        private int account = 100;
        //需要声明这个锁
        private Lock lock = new ReentrantLock();
        public int getAccount() {
            return account;
        }
        //这里不再需要synchronized 
        public void save(int money) {
            lock.lock();
            try{
                account += money;
            }finally{
                lock.unlock();
            }

        }
    }

5.使用ThreadLocal

    public class Bank{
        //使用ThreadLocal类管理共享变量account
        private static ThreadLocal account = new ThreadLocal(){
            @Override
            protected Integer initialValue(){
                return 100;
            }
        };
        public void save(int money){
            account.set(account.get()+money);
        }
        public int getAccount(){
            return account.get();
        }
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67693.html

相关文章

  • Java™ 教程(同步

    同步 线程主要通过共享对字段和引用对象的引用字段的访问来进行通信,这种通信形式非常有效,但可能产生两种错误:线程干扰和内存一致性错误,防止这些错误所需的工具是同步。 但是,同步可能会引入线程竞争,当两个或多个线程同时尝试访问同一资源并导致Java运行时更慢地执行一个或多个线程,甚至暂停它们执行,饥饿和活锁是线程竞争的形式。 本节包括以下主题: 线程干扰描述了当多个线程访问共享数据时如何引入错误。...

    Edison 评论0 收藏0
  • Java011-多线程

    摘要:多线程进程正在进行中的程序。所以容易出现线程安全问题。等待唤醒机制涉及的方法将同步中的线程处于冻结状态。返回该线程的字符串表示形式,包括线程名称优先级和线程组。暂停当前正在执行的线程对象,并执行其他线程。 多线程:进程:正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。线程:其实就是进程中一个程序执行控制单元,一条执行路径。进程负责的是应用程序的空间的标示。线程负责的是应...

    gekylin 评论0 收藏0
  • java多线程编程核心技术 2

    摘要:在两个线程访问同一个对象中的同步方法时一定是线程安全的。当一个线程访问的一个同步代码块时,其他线程对同一个钟所有其他同步代码块的访问被阻塞,这说明使用的对象监视器是一个。 非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是脏读,也就是取到的数据其实是被更改过的。而线程安全就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象。 非线程安全问题存...

    wangxinarhat 评论0 收藏0
  • Java 多线程

    摘要:当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程所有运行中的任务通常对应一个进程。线程也被称作轻量级进程,线程是进程的执行单元。在线程的生命周期中,它要经过新 线程概述 线程和进程 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程 所有运...

    zorro 评论0 收藏0
  • 线程安全

    摘要:不可变在中,不可变的对象一定是线程安全的。在里标注自己是线程安全的类,大多都不是绝对线程安全,比如某些情况下类在调用端也需要额外的同步措施。无同步方案要保证线程安全,不一定就得需要数据的同步,两者没有因果关系。 在之前学习编程的时候,有一个概念根深蒂固,即程序=算法+数据结构。数据代表问题空间中的客体,代码就用来处理这些数据,这种思维是站在计算机的角度去抽象问题和解决问题,称之为面向过...

    fuyi501 评论0 收藏0
  • Java 重入锁 ReentrantLock 原理分析

    摘要:的主要功能和关键字一致,均是用于多线程的同步。而仅支持通过查询当前线程是否持有锁。由于和使用的是同一把可重入锁,所以线程可以进入方法,并再次获得锁,而不会被阻塞住。公平与非公平公平与非公平指的是线程获取锁的方式。 1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似。所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻...

    lx1036 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<