synchronized (class):class类的同步,同步的时候会同步整个class

synchronized (Object):Object的同步,只对其中的对象同步

如下:对类B中的同步代码块的同步,对比之后放可明白

synchronized (MyThread.class)

例:

A:类UnsafeSequence

public class UnsafeSequence {
    private static int value;
    
    public int getValue()
    {
        synchronized (UnsafeSequence.class) {
            return value++;
        }
    }
    
    public int getValueA()
    {
        synchronized (this) {
            return value++;
        }
    }
}

B:类MyThread

public class MyThread implements Runnable {
    private UnsafeSequence unsafe;
    private static int value;
    
    @Override
    public void run() {
        unsafe = new UnsafeSequence();
        for(int i = 0; i < 60; i++)
        {
            synchronized (MyThread.class) {
                System.out.println(Thread.currentThread().getName() + "----in:");
                System.out.println(Thread.currentThread().getName() + " thread run i = " + i + ";value = " + unsafe.getValue());
                System.out.println(Thread.currentThread().getName() + "----out:" + value++);
            }
        }
    }

}

C:主函数

public class TestMain {
    public static void main(String[] args) {
        MyThread target_1 = new MyThread();
        MyThread target_2 = new MyThread();
        Thread thread_1 = new Thread(target_1, "A");
        Thread thread_2 = new Thread(target_2, "B");
        thread_1.start();
        thread_2.start();
    }
}

结果如下:

B----in:
B thread run i = 0;value = 0
B----out:0
B----in:
B thread run i = 1;value = 1
B----out:1
B----in:
B thread run i = 2;value = 2
B----out:2

去掉B中的同步,或换为Object,结果如下:

A----in:
B----in:
A thread run i = 0;value = 0
B thread run i = 0;value = 1
A----out:0
B----out:1
A----in:
B----in:
A thread run i = 1;value = 2
B thread run i = 1;value = 3
B----out:3
B----in:
A----out:2

控制同步:

public class MyThread implements Runnable {
    private UnsafeSequence unsafe;
    private static int value;
    
    @Override
    public void run() {
        synchronized (MyThread.class) {
            unsafe = new UnsafeSequence();
            for(int i = 0; i < 60; i++)
            {
                System.out.println(Thread.currentThread().getName() + "----in:");
                System.out.println(Thread.currentThread().getName() + " thread run i = " + i + ";value = " + unsafe.getValue());
                System.out.println(Thread.currentThread().getName() + "----out:" + value++);
            }
        }
    }
}

线程同步synchronized,Class与Object的更多相关文章

  1. Java线程(二):线程同步synchronized和volatile

    上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...

  2. 线程同步 synchronized 同步代码块 同步方法 同步锁

    一 同步代码块 1.为了解决并发操作可能造成的异常,java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块.其语法如下: synchronized(obj){ // ...

  3. 线程同步synchronized,wait,notifyAll 测试示例

    https://www.cnblogs.com/LipeiNet/p/6475851.html 一  synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中 ...

  4. 线程同步synchronized和ReentrantLock

    一.线程同步问题的产生及解决方案 问题的产生: Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突. 如下例:假设有一个卖票 ...

  5. 多线程学习-基础( 九)线程同步Synchronized关键字

    一.线程同步1.synchronized关键字的作用域有二种:(1)某个对象实例内:synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果 ...

  6. [03] 线程同步 synchronized

    1.线程同步概述 线程之间有可能共享一些资源,比如内存.文件.数据库等.多个线程同时读写同一份共享资源时,就可能引起冲突,所以引入了线程的"同步"机制. 所谓同步,就是说线程要有先 ...

  7. Java线程同步synchronized的理解

    JVM中(留神:马上讲到的这两个存储区只在JVM内部与物理存储区无关)存在一个主内存(Main Memory),Java中所有的变量存储在主内存中,所有实例和实例的字段都在此区域,对于所有的线程是共享 ...

  8. java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决

    0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...

  9. Day13_71_线程同步(synchronized)

    线程同步 * 异步编程模型和同步编程模拟的区别? - 有T1和T2 两个线程 > 异步编程模型:T1线程执行T1的,T2线程执行T2的,谁也不等谁 > 同步编程模型:T1和T2 线程执行, ...

随机推荐

  1. java_XML_DOM1

    一.Java DOM 的 API: 1.解析器工厂类:DocumentBuilderFactory 创建的方法:DocumentBuilderFactory dbf = DocumentBuilder ...

  2. linux文件相关的命令

    1.linux下的文件分为字符设备文件和块设备文件 2.文件的属性有读写权限.执行权限.访问时间.修改时间.状态改变时间等. 状态改变时间指修改了文件的读写权限或者所有者等操作. 3.ls -l 执行 ...

  3. Sublime Text 中文乱码解决方案

    1.到这里下载安装PackageControl https://packagecontrol.io/installation#Manual 完成重启Sublime Text: 2.按Ctrl+Shif ...

  4. 深入浅出妙用 Javascript 中 apply、call、bind

    这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: "对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂 ...

  5. APC注入

    0X01 注入原理 当线程被唤醒时APC中的注册函数会被执行的机制,并依此去调用我们的DLL加载代码,进而完成注入的目的 具体的流程: 1 当EXE里的某个线程执行到sleepEX(),或者waitF ...

  6. STAR法则

    现在相信大部分跳槽的朋友都已经将工作辞了,正在找工作的这个漩涡中,还没辞掉的可能也快了,找工作的这段时间是一个非常考验你的扛打击能力的时候.像网上投了几十家简历,只有几家邀请面试的,其他都是连面试阶段 ...

  7. VMware虚拟网络连接模式详解(NAT,Bridged,Host-only)

    序言 如果你使用VMware安装虚拟机,那么你必定会选择网络连接,那么vmware提供主要的3种网络连接方式,我们该如何抉择呢?他们有什么不同呢?这篇我们就做一个深入. 首先打开虚拟机设置里面的网络适 ...

  8. c++ STL常用算法使用方法

    #include <string> #include <vector> #include <functional> #include <iostream> ...

  9. [Hadoop] - Protocol Buffer安装

    Hadoop从2.x版本开始,底层的RPC远程调用使用ProtocolBuffer格式来传递数据,所以在编译Hadoop的过程中有可能出现提示缺少Protocol服务的异常信息,类似:'protoc ...

  10. MongoDB【第二篇】集群搭建

    第一步:准备 1.安装包 mongodb-linux-x86_64-rhel70-3.4.2.tgz 2. 架构: 本文为 1-primary.1-secondary.1-arbiter 的 mong ...