Java线程同步(含详细解释/代码实例)

简介: Java线程同步(含详细解释/代码实例)

一、为解决线程安全问题,Java引入监视器(monitor)来保证共享数据的同步性。任何对象都可作为一个监视器,关键词synchronized修饰某个对象后,该对象就成为监视器。

二、同步代码块只能有一个线程独占执行。

三、同步代码块作用:多个线程第共享资源操作容易引起冲突,这些容易引起冲突的代码块称之为临界区,在临界区通过引入监视器,并用synchronized使多个线程在临界区同步起来,从而避免可能引起的冲突。

四、Synchronized的三种用法:

       1、synchronized代码块:监视器为指定的对象。

       2、synchronized方法:监视器为this对象。

       3、synchronized静态方法:监视器为相应的类。

一、关键词synchronized加在run方法前

代码展示:

class Resource implements Runnable{
    volatile public int i;
    public Resource(int _i){
        i=_i;
    }
    public synchronized void run(){ //关键词synchronized加在run方法前
        while(true){
                if(i>0){
                    try{Thread.sleep(200);}
                    catch (Exception e){}
                        i--;
                        System.out.println(Thread.currentThread().getName()+" "+i);
                    }
                else{
                    System.out.println(Thread.currentThread().getName());
                    break;
                }
        }
    }
}
public class TestSecurity {
    public static void main(String[] args){
        Resource m=new Resource(4);
        Thread t1=new Thread(m);
        Thread t2=new Thread(m);
        t1.start();
        t2.start();
    }
}

image.gif

运行结果如下:

image.gif编辑

补充说明:本程序仅Thread-0完成了i的自减过程,因关键字synchronized加在run()方法前,监视器为Resource对象。系统调度的结果使Thread-0在此刻先获得了Resource监视权,在没有完成Resource对象run方法调用前,Thread-1线程无法获得该监视器所有权

二、synchronized代码块

代码展示:

class Resource1 implements Runnable{
    volatile public int i;
    volatile public Integer it;
    public Resource1(int _i){
        i=_i;
        it=new Integer(i);//new 一个Integer对象的时候,实际上是生成了一个指针指向此对象;
    }
    public  void run(){
        while(true){
            synchronized (it) {//synchronized代码块
                if (i > 0) {
                    try {
                        Thread.sleep(200);
                    } 
                    catch (Exception e) {}
                    i--;
                    System.out.println(Thread.currentThread().getName() + " " + i);
                }
                else {
                    System.out.println(Thread.currentThread().getName());
                    break;
                }
            }
        }
    }
}
public class TestSecurity1 {
    public static void main(String[] args){
        Resource1 m=new Resource1(4);
        Thread t1=new Thread(m);
        Thread t2=new Thread(m);
        t1.start();
        t2.start();
    }
}

image.gif

运行结果如下:

image.gif编辑

补充说明:此代码增加了一个Resource对象的属性it,它引用一个对象,此对象充当监视器,用synchronized(it)表示,并构成一个同步代码块。当“Thread-1”执行到synchronized(it)代码块时,其获得了该监视权,“Thread-1”未执行完同步代码,“Thread-0”因无法获得监视权而不能进入同步代码块。“Thread-1”执行完同步代码块后,释放监视权,“Thread-0”获得监视权后执行同步代码块,这就实现了两个线程对共享资源操作的同步。

目录
相关文章
|
10天前
|
Java 调度 开发者
Java并发编程:解锁多线程同步的奥秘
在Java的世界里,并发编程是提升应用性能的关键所在。本文将深入浅出地探讨Java中的并发工具和同步机制,带领读者从基础到进阶,逐步掌握多线程编程的核心技巧。通过实例演示,我们将一起探索如何在多线程环境下保持数据的一致性,以及如何有效利用线程池来管理资源。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你对Java并发编程有更深入的理解和应用。
|
11天前
|
存储 Java 程序员
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
33 4
|
21天前
|
安全 Java 程序员
Java 并发编程:解锁多线程同步的奥秘
【7月更文挑战第30天】在Java的世界里,并发编程是一块充满挑战的领域。它如同一位严苛的导师,要求我们深入理解其运作机制,才能驾驭多线程的力量。本文将带你探索Java并发编程的核心概念,包括线程同步与通信、锁机制、以及并发集合的使用。我们将通过实例代码,揭示如何在多线程环境中保持数据的一致性和完整性,确保你的应用程序既高效又稳定。准备好了吗?让我们一同踏上这段解锁Java并发之谜的旅程。
26 5
|
23天前
|
安全 Java API
Java并发编程的艺术:解锁多线程同步与协作的秘密
【7月更文挑战第28天】在Java的世界中,并发编程如同一场精心编排的交响乐,每一个线程都是乐团中的乐手,而同步机制则是那指挥棒,确保旋律的和谐与统一。本文将深入探讨Java并发编程的核心概念,包括线程的创建、同步机制、以及线程间的通信方式,旨在帮助读者解锁Java多线程编程的秘密,提升程序的性能和响应性。
29 3
|
5天前
|
Java UED
基于SpringBoot自定义线程池实现多线程执行方法,以及多线程之间的协调和同步
这篇文章介绍了在SpringBoot项目中如何自定义线程池来实现多线程执行方法,并探讨了多线程之间的协调和同步问题,提供了相关的示例代码。
31 0
|
5天前
|
NoSQL Redis
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
|
5天前
|
缓存 Java
Java本地高性能缓存实践问题之创建一个AsyncCache实例的问题如何解决
Java本地高性能缓存实践问题之创建一个AsyncCache实例的问题如何解决
|
5天前
|
存储 缓存 监控
Java本地高性能缓存实践问题之在EncacheTest示例中正确移除一个缓存实例的问题如何解决
Java本地高性能缓存实践问题之在EncacheTest示例中正确移除一个缓存实例的问题如何解决
|
19天前
|
安全 Java API
Java中的并发编程:深入理解线程同步与协作机制
在Java的并发编程领域中,线程间的同步与协作是实现高效、稳定多线程应用的关键。本文将深入探讨Java中用于线程同步的各种锁机制,包括内置锁和显式锁,以及线程间协作的等待/通知机制。同时,我们将通过实例分析这些机制的应用,并指出常见的并发问题及解决方案,旨在为读者提供一套完整的Java并发编程指南。
|
存储 Java 关系型数据库
20 个实例玩转 Java 8 Stream
20 个实例玩转 Java 8 Stream
266 0
20 个实例玩转 Java 8 Stream