1.synchronized(object)

package test.thread;

import java.io.IOException;

import org.junit.Test;

/*
 * 测试线程锁
 */
public class TestBlock {

        public static void main(String[] args)  {
            TestBlock test = new TestBlock();
            MyTest thread1 = test.new MyTest(test);
            thread1.setName("1");
            MyTest thread2 = test.new MyTest(test);
            thread2.setName("2");
            thread1.start();
            thread2.start();
        }
    /*
     * 测试同步
     */
    class MyTest extends Thread{
        private Object o;

        public  MyTest(Object o){
            this.o=o;
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            synchronized (o) {  //这个o是test对象的实例 ,对类对象实例进行加锁,当线程调用一个实例运行的,另外的线程调用这个实例时候阻塞,达到上锁的目的
                try {
                    for(int a=0;a<3;a++){
                        System.out.println("线程"+MyTest.currentThread().getName()+"修改a=="+a);
                        //MyTest.yield();
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }

            }
        }

    }    

}

返回的结果:  ·      

     

线程1修改a==0
线程1修改a==1
线程1修改a==2
线程1修改a==3
线程1修改a==4
线程1修改a==5
线程1修改a==6
线程1修改a==7
线程1修改a==8
线程1修改a==9
线程2修改a==0
线程2修改a==1
线程2修改a==2
线程2修改a==3
线程2修改a==4
线程2修改a==5
线程2修改a==6
线程2修改a==7
线程2修改a==8
线程2修改a==9

可以看到当一个线程运行完毕之后才运行第二个线程

2.synchronized(this)

package test.thread;

import java.io.IOException;

import org.junit.Test;

/*
 * 测试线程锁
 */
public class TestBlock {   //调用类

        public static void main(String[] args)  {
            TestBlock test = new TestBlock();
            MyTest thread1 = test.new MyTest(test);
            thread1.setName("1");
            MyTest thread2 = test.new MyTest(test);
            thread2.setName("2");
            thread1.start();
            thread2.start();
        }
    /*
     * 测试同步
     */
    class MyTest extends Thread{
        private Object o;

        public  MyTest(Object o){
            this.o=o;
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            synchronized (this) {  //this 指代当时类 也就是MyTest,两个线程同时调用同一个类方法。就是两个线程对两个实例的各自上锁。互相不阻塞
try { for(int a=0;a<10;a++){ System.out.println("线程"+MyTest.currentThread().getName()+"修改a=="+a); //MyTest.yield();  } } catch (Exception e) { // TODO: handle exception  } } } } }

返回的结果:

线程1修改a==0
线程1修改a==1
线程1修改a==2
线程1修改a==3
线程1修改a==4
线程2修改a==0
线程1修改a==5
线程1修改a==6
线程1修改a==7
线程1修改a==8
线程1修改a==9
线程2修改a==1
线程2修改a==2
线程2修改a==3
线程2修改a==4
线程2修改a==5
线程2修改a==6
线程2修改a==7
线程2修改a==8
线程2修改a==9

 

java synchronized(object/this)的 区别的更多相关文章

  1. Java synchronized和 Lock 的区别与用法

    在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方.  ...

  2. java - synchronized与lock的区别

    synchronized与lock的区别 原始构成 synchronized是关键字属于JVM层面 monitorenter(底层是通过monitor对象来完成,其实wait/notify等对象也依赖 ...

  3. Java class,Object,Class的区别

    代码: http://www.cnblogs.com/hongdada/p/6060487.html package com.company; public class Main { public s ...

  4. Java泛型Object和?区别

    在写spark streamming读取kafka latest offset的时候,有一下语句: Map<TopicAndPartition, Object> latestOffsets ...

  5. java synchronized与volatile的区别

    java线程同步有两个特性,一个是可见性,一个是有序性.在解释这两个概念之前,先说下两个重要的概念,主内存(main memory)和工作内存(working memory),线 程之间数据的交互不是 ...

  6. Java Synchronized Method This Static Class Object 区别

    1. 必须基于对象 Synchronized Method 和 Synchronized(this) 块,除了范围小点 (方法和块),没差别都是阻塞整个对象 - 如果对象有多个 Synchronize ...

  7. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  8. java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解

    synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synchronized ...

  9. Java中synchronized和Lock的区别

    synchronized和Lock的区别synchronize锁对象可以是任意对象,由于监视器方法必须要拥有锁对象那么任意对象都可以调用的方法所以将其抽取到Object类中去定义监视器方法这样锁对象和 ...

随机推荐

  1. python 【第三篇】函数基础

    深浅拷贝 set是一个无序且不重复的元素集合访问速度快天生解决重复问题 #!/usr/bin/env python3 # -*- coding:utf-8 -*- #深浅拷贝 import copy ...

  2. linux 【第五篇】特殊权限及定时任务

    特殊权限 [root@VM_141_154_centos ~]# ls -ld /tmp drwxrwxrwt. 8 root root 4096 Apr 5 08:11 /tmp /tmp/ 公共目 ...

  3. rm -rf / – Deletes Everything!

    https://www.howtogeek.com/125157/8-deadly-commands-you-should-never-run-on-linux/

  4. TCP Operational Overview and the TCP Finite State Machine (FSM) http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF.htm

    http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF.htm   http://tcpipgu ...

  5. AutoIT: WinActivate可以把要操作的窗口提前。

    If WinExists("[CLASS:Notepad2]") Then Local $hWnd = WinWait() ; Convert the handle to a st ...

  6. hdu 2553(N皇后问题)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. Overview of MIDI

    东拼西凑的介绍 MIDI which means Musical Instrument Digital Interface, introduced in 1980's provided a inter ...

  8. 【196】Dell 移动工作站系统安装方法

    会出现找不到硬盘的情况,解决方法:安装系统的时候需要加载阵列卡驱动 下载阵列卡驱动,以 Dell T7610 为例根据安装系统进行选择,地址:http://zh.community.dell.com/ ...

  9. springMVC访问根路径问题

    当web.xml没有配置欢迎页:如下 <welcome-file-list> <welcome-file>login.jsp</welcome-file> < ...

  10. python pip安装第三方模块

    一.pip工具使用 安装windows版本python,自带pip工具.2者路径相同. 如果设置了环境路径,可以直接在命令提示符窗口下尝试运行pip.如果没有设置环境路径,可以先cd命令到pip工具的 ...