线程同步(synchronized关键字)

2024-09-04 21:32

本文主要是介绍线程同步(synchronized关键字),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概念

解决数据共享问题,必须使用同步,所谓同步就是指多个线程在同一时间段内只能有一个线程执行代码,其他线程要等待此线程完成之后才可以继续执行。

方法

线程进行同步,有以下两种方法:
(1)同步代码块
synchronized(要同步的对象){
要同步的操作;
}
(2)同步方法
public synchronized void method(){
要同步的操作;
}
同步代码块示例

package 线程同步与死锁;
public class Example {public static void main(String[] args) {MyThread my=new MyThread();Thread t1=new Thread(my,"小白");Thread t2=new Thread(my,"小红");t1.start();t2.start();}
}
class MyThread implements Runnable{Object obj=new Object();//同步的标记对象,可以设置为任意对象public void run() {/** 同步代码块* 当某一线程运行至同步代码块时,obj的赋值将会改变* 比如没有线程进入同步代码块时,obj==0,表示代码块为开放状态* 当有线程运行至同步代码块时,obj==1,* 表示代码块为上锁状态,不允许其他线程进入* */synchronized (obj) {System.out.println(Thread.currentThread().getName()+"正在出恭……");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"出恭完毕……");}}

同步代码块输出
同步方法示例:

package 线程同步与死锁;
public class Example {public static void main(String[] args) {MyThread my=new MyThread();Thread t1=new Thread(my,"小白");Thread t2=new Thread(my,"小红");t1.start();t2.start();}
}
class MyThread implements Runnable{Object obj=new Object();//同步的标记对象,可以设置为任意对象public void run() {doMethod();}/** 同步方法,标记对象当前对象(this)* 当同时又若干个同步方法时,this却只有一个* this被使用时会上锁(也就是进行赋值标记),* 确保同步方法不会同时执行多个* */public synchronized void doMethod(){System.out.println(Thread.currentThread().getName()+"正在出恭……");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"出恭完毕……");}
}

同步方法输出

注意

当编写synchronized块时,有几个简单的准则可以遵循,这些准则在避免死锁性能危险的风险方面大有帮助
(1)使代码块保持简短,把不需要同步的代码移出代码块
(2)不要阻塞。如在代码块中使用InputStream.read()。
(3) 在代码块中,尽量不要再调用其他类中声明的方法,防止死锁

这篇关于线程同步(synchronized关键字)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137086

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

Oracle Start With关键字

Oracle Start With关键字 前言 旨在记录一些Oracle使用中遇到的各种各样的问题. 同时希望能帮到和我遇到同样问题的人. Start With (树查询) 问题描述: 在数据库中, 有一种比较常见得 设计模式, 层级结构 设计模式, 具体到 Oracle table中, 字段特点如下: ID, DSC, PID; 三个字段, 分别表示 当前标识的 ID(主键), DSC 当

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu