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. Mcaca+Python 测试环境搭建及上手

    Macaca是一套面向用户端软件的测试解决方案,提供了自动化驱动,周边工具,集成方案,旨在解决终端上的测试.自动化.性能等方面的问题,很多人选择它的原因简单:轻量化(相比于appium),跨平台(wi ...

  2. 使用LVS实现负载均衡原理及安装配置详解

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...

  3. redis-如何在工程中使用redis

    这里,我们介绍下如何使用redis作为缓存服务器使用在我们的工程中. 使用思路 对于java中的使用redis提供了一个jedis的jar包.我们在安装好我们的redis服务器以后,只需要通过redi ...

  4. 腾讯优图及知脸(ZKface)人脸比对接口测试(python)

    一.腾讯优图 1.开发者地址:http://open.youtu.qq.com/welcome/developer 2.接入流程:按照开发者页面的接入流程接入之后,创建应用即可获得所需的AppID.S ...

  5. android 项目更改包名的方法

    本文章全文转载: http://www.2cto.com/kf/201304/206747.html 1.在项目上右键,选择android tools->rename application p ...

  6. poj1611

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 35918   Accepted: 17458 De ...

  7. JVM内存

    大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack( ...

  8. 49-Group Anagrams-(Medium) 题解

    1.题目 Given an array of strings, group anagrams together. For example, given: ["eat", " ...

  9. 【openstack N版】——网络服务neutron

    一.openstack网络服务neutron 1.1neutron介绍 neutron是openstack重要组件之一,在以前是时候没有neutron项目,早期的时候是没有neutron,早期所使用的 ...

  10. p1217晚餐(简单的dijkstra)

    题目: 输入: 1000 5 61 2 3002 4 2003 4 6003 4 8005 3 1002 5 650 输出: 4 这道题呢,其实就是用邻接矩阵将每条边耗费的体力存起来,然后用dijks ...