关键字synchronized还可以应用在static静态方法上,这样写那是对当前的*.java文件对应的class类进行持锁,

测试如下

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public static void printA() {
try {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public static void printB(){
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end"); } }
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{ @Override
public void run() {
super.run();
Service.printA();
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ @Override
public void run() {
super.run();
Service.printB();
}
}
package com.cky.test;

import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA();
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB();
threadB.setName("b");
threadB.start();
}
}
printA ThreadNameabegin
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend Process finished with exit code 0

程序运行结果:

同步的效果,和将synchronized关键字加到非static方法上使用的效果一致,但还是存在本质上的区别,synchronized加到static静态方法上时给Class类上锁,而加到非static静态方法上是给对象上锁。

为了验证不是同一个锁,测试如下。

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public static void printA() {
try {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public static void printB(){
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end"); } synchronized public void printC(){
System.out.println("printc ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printc ThreadName"+Thread.currentThread().getName()+ "end"); } }
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{ @Override
public void run() {
super.run();
Service.printA();
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ @Override
public void run() {
super.run();
Service.printB();
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadC extends Thread{ private Service service; public ThreadC(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.printC();
}
}
package com.cky.test;

import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB;
import com.cky.thread.ThreadC; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA();
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB();
threadB.setName("b");
threadB.start();
ThreadC threadC = new ThreadC(service);
threadC.setName("c");
threadC.start();
}
}
C:\itsoft\jdk\bin\java -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\itsoft\idea\IntelliJ IDEA 2016.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\itsoft\jdk\jre\lib\charsets.jar;C:\itsoft\jdk\jre\lib\deploy.jar;C:\itsoft\jdk\jre\lib\ext\access-bridge-32.jar;C:\itsoft\jdk\jre\lib\ext\cldrdata.jar;C:\itsoft\jdk\jre\lib\ext\dnsns.jar;C:\itsoft\jdk\jre\lib\ext\jaccess.jar;C:\itsoft\jdk\jre\lib\ext\jfxrt.jar;C:\itsoft\jdk\jre\lib\ext\localedata.jar;C:\itsoft\jdk\jre\lib\ext\nashorn.jar;C:\itsoft\jdk\jre\lib\ext\sunec.jar;C:\itsoft\jdk\jre\lib\ext\sunjce_provider.jar;C:\itsoft\jdk\jre\lib\ext\sunmscapi.jar;C:\itsoft\jdk\jre\lib\ext\sunpkcs11.jar;C:\itsoft\jdk\jre\lib\ext\zipfs.jar;C:\itsoft\jdk\jre\lib\javaws.jar;C:\itsoft\jdk\jre\lib\jce.jar;C:\itsoft\jdk\jre\lib\jfr.jar;C:\itsoft\jdk\jre\lib\jfxswt.jar;C:\itsoft\jdk\jre\lib\jsse.jar;C:\itsoft\jdk\jre\lib\management-agent.jar;C:\itsoft\jdk\jre\lib\plugin.jar;C:\itsoft\jdk\jre\lib\resources.jar;C:\itsoft\jdk\jre\lib\rt.jar;C:\多线程核心技术\第一章\out\production\第一章;C:\itsoft\idea\IntelliJ IDEA 2016.3.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.cky.test.Test
printA ThreadNameabegin
printc ThreadNamecbegin
printc ThreadNamecend
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend

结果可见:

a和b和c是异步执行的,而不是按顺序执行的,因为一个是对象锁,一个是class锁,而class锁可以对所有的实例起作用

测试如下

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { synchronized public static void printA() {
try {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public static void printB(){
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end"); } }
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadA extends Thread{
private Service service; public ThreadA(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.printA();
}
}
package com.cky.thread;

import com.cky.bean.Service;

/**
* Created by edison on 2017/12/8.
*/
public class ThreadB extends Thread{ private Service service; public ThreadB(Service service) {
this.service = service;
} @Override
public void run() {
super.run();
service.printB();
}
}
package com.cky.test;

import com.cky.bean.Service;
import com.cky.thread.ThreadA;
import com.cky.thread.ThreadB; /**
* Created by edison on 2017/12/8.
*/
public class Test {
public static void main(String[] args) {
Service service1 = new Service();
Service service2 = new Service();
ThreadA threadA = new ThreadA(service1);
threadA.setName("a");
threadA.start();
ThreadB threadB = new ThreadB(service2);
threadB.setName("b");
threadB.start(); }
}
printA ThreadNameabegin
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend

同步synchronized(class)代码块的作用和synchronized static 方法一样,

测试如下修改Service类如下

package com.cky.bean;

/**
* Created by edison on 2017/12/8.
*/
public class Service { public static void printA() {
try {
synchronized (Service.class) {
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "begin");
Thread.sleep(2000);
System.out.println("printA ThreadName"+Thread.currentThread().getName()+ "end");
} } catch (InterruptedException e) {
e.printStackTrace();
}
} public static void printB(){
synchronized(Service.class) {
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "begin");
System.out.println("printb ThreadName"+Thread.currentThread().getName()+ "end");
} } }
printA ThreadNameabegin
printA ThreadNameaend
printb ThreadNamebbegin
printb ThreadNamebend

2.2.9静态同步synchronized方法与synchronized(class)代码块的更多相关文章

  1. 2.java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

    1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名. ...

  2. static方法,属性,代码块初始化顺序和执行顺序

    http://greateryang.blog.163.com/blog/static/81953375201232621031508/

  3. 深入理解Java中的同步静态方法和synchronized(class)代码块的类锁

    一.回顾学习内容 在前面几篇博客中我我们已经理解了synchronized对象锁.对象锁的重入.synchronized方法块.synchronized非本对象的代码块, 链接:https://www ...

  4. Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  5. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

    构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...

  6. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  7. Synchronized方法锁、对象锁、类锁区别

    synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...

  8. java两种同步机制的实现 synchronized和reentrantlock

    java两种同步机制的实现 synchronized和reentrantlock 双11加保障过去一周,趁现在有空,写一点硬货,因为在进入阿里之后工作域的原因之前很多java知识点很少用,所以记录一下 ...

  9. 多线程同步锁和死锁以及synchronized与static synchronized 的区别

    线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序.简而言之:一个程序运行后至少有一个进程,一个进程 ...

随机推荐

  1. mysql decimal(10,2)对应java类型

    下面我给出MYSQL类型与JAVA类型对应表,希望能够帮到您: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.S ...

  2. 在textarea中鼠标指定的位置插入字符或表情

    有些时候我们已经在textarea中输入了一些字符,然后想在鼠标指定的位置插入表情或者字符,这就需要用到jquery的一个小插件了. 代码如下: (function ($) { $.fn.extend ...

  3. os模块。笔记

    os 模块提供了很多允许你的程序与操作系统直接交互的功能 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir()  ...

  4. c#多线程下的进程同步SignalAndWait 使用简单说明

    解释:向一个 WaitHandle 发出信号并等待另一个进入信号. 总体概述: .NET Framework中提供一些类用于手动进行线程间的访问同步.这些类主要分为3大类别(但正如下文中会看到的这些类 ...

  5. 对于读txt文件一点总结

    txt 内容 中间有比如如空格,制表符(tab)在txt为空格符(Spaces).回车符.换行符,有空字符串等情况,在读取过滤中要充分考虑到 1:打开文件 var sr=new StreamReade ...

  6. 计算器类(C++&JAVA——表达式转换、运算、模板公式)

    运行: (a+b)*c 后缀表达式:ab+c* 赋值: Enter the a : 10 Enter the b : 3 Enter the c : 5 结果为:65 代码是我从的逻辑判断系统改过来的 ...

  7. PHP Jquery 代码操作 内容 属性 样式 事件 Json数据

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Hyperscan与Snort的集成方案

    概况 Hyperscan作为一款高性能的正则表达式匹配库,非常适用于部署在诸如DPI/IPS/IDS/NGFW等网络解决方案中.Snort (https://www.snort.org) 是目前应用最 ...

  9. 转载(windows下安装mysql)

    转载请声明出处:http://blog.csdn.net/u013067166/article/details/49951577             最近重装了系统,去MySQL官网下载了最新的M ...

  10. mysql进程挂了

    .查看日志文件位置:cat /etc/my.cnf .搜索:cat /data/mysql/mysql-error.log|grep 'Shutdown complete' 3.进一步搜索:cat / ...