/**
* @author admin
* @date 2018/1/12 9:48
* 作用在同一个实例对象上讨论
* synchronized同步方法的测试
* 两个线程,一个线程调用synchronized修饰方法,另一个线程可以调用非synchronized修饰的方法,互不影响
*/
public class SynchronizedTest { public synchronized void methodA() {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodA-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} public void methodB() {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodB-" + i );
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} } public static void main(String[] args) {
SynchronizedTest test = new SynchronizedTest();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
test.methodA();
}
});
thread1.start(); Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
test.methodB();
}
});
thread2.start();
}
} 运行结果:
methodA-0
methodB-0
methodA-1
methodB-1
methodB-2
methodA-2
methodA-3
methodB-3
methodA-4
methodB-4
/**
* @author admin
* @date 2018/1/12 10:16
* 作用在同一个实例对象上讨论
* Sychronized代码块的测试
* 两个线程,一个线程执行synchronized代码块,另一个线程执行非synchronized代码块
*/
public class SychronizedTest2 {
public void methodA() {
synchronized (this) {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodA-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} }
} public void methodB() {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodB-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
SychronizedTest2 test2 = new SychronizedTest2();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
test2.methodA();
}
});
thread1.start(); Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
test2.methodB();
}
});
thread2.start();
}
} 运行结果:
methodA-0
methodB-0
methodA-1
methodB-1
methodA-2
methodB-2
methodB-3
methodA-3
methodA-4
methodB-4
/**
* @author admin
* @date 2018/1/12 10:33
* 作用在同一个实例对象上讨论
* Synchronized同步方法和同步代码块
* 1、synchronized和synchronized(this)二者没区别,都作用在this对象锁上面,所以会同步
* 2、synchronized(obj),这个是作用在obj对象锁上面,和this对象锁不同,所以不会同步
*/
public class SynchronizedTest3 {
public synchronized void methodA() {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodA-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} public void methodB() {
synchronized (this) {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodB-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void methodC() {
Object obj = new Object();
synchronized (obj) {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodC-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
SynchronizedTest3 test3 = new SynchronizedTest3();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
test3.methodA();
}
});
thread1.start(); Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
test3.methodB();
}
});
thread2.start(); Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
test3.methodC();
}
});
thread3.start(); }
} 运行结果:
methodA-0
methodC-0
methodA-1
methodC-1
methodA-2
methodC-2
methodA-3
methodC-3
methodA-4
methodC-4
methodB-0
methodB-1
methodB-2
methodB-3
methodB-4
/**
* @author admin
* @date 2018/1/12 10:48
* 作用在同一个类上讨论,每一个类只有一个类锁
* synchronized类锁
* static synchronized 和 synchronized(SynchronizedTest4.class),都是作用在同一个类锁上,所以会同步
*/
public class SynchronizedTest4 {
public synchronized static void methodA() {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodA-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} public void methodB() {
synchronized (SynchronizedTest4.class) {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodB-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
SynchronizedTest4 test4 = new SynchronizedTest4();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
test4.methodA();
}
});
thread1.start(); Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
test4.methodB();
}
});
thread2.start();
}
} 运行结果:
methodA-0
methodA-1
methodA-2
methodA-3
methodA-4
methodB-0
methodB-1
methodB-2
methodB-3
methodB-4
/**
* @author admin
* @date 2018/1/12 11:03
* synchronized的对象锁和static synchronized的类锁,是两个不同的锁,所以不会同步
* 两个线程,一个调用对象锁,一个调用类锁
*/
public class SynchronizedTest5 {
public synchronized void methodA() {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodA-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} public synchronized static void methodB() {
try {
for (int i = 0; i < 5; i++) {
System.out.println("methodB-" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
SynchronizedTest5 test5 = new SynchronizedTest5();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
test5.methodA();
}
});
thread1.start(); Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
test5.methodB();
}
});
thread2.start();
}
} 运行结果:
methodA-0
methodB-0
methodA-1
methodB-1
methodB-2
methodA-2
methodB-3
methodA-3
methodB-4
methodA-4

java的同步方法和同步代码块,对象锁,类锁区别的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. Java的synchronized的同步代码块和同步方法的区别

    synchronized同步方法和同步代码块的区别 同步方法默认使用this或者当前类做为锁. 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不 ...

  3. 对象及变量的并发访问(同步方法、同步代码块、对class进行加锁、线程死锁)&内部类的基本用法

    主要学习多线程的并发访问,也就是使得线程安全. 同步的单词为synchronized,异步的单词为asynchronized 同步主要就是通过锁的方式实现,一种就是隐式锁,另一种是显示锁Lock,本节 ...

  4. java中的synchronized同步代码块和同步方法的区别

    下面这两段代码有什么区别? //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized ...

  5. 牛客网Java刷题知识点之同步方法和同步代码块的区别(用synchronized关键字修饰)

    不多说,直接上干货! 扩展博客 牛客网Java刷题知识点之多线程同步的实现方法有哪些 为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查 ...

  6. java线程基础巩固---同步代码块以及同步方法之间的区别和关系

    在上一次中[http://www.cnblogs.com/webor2006/p/8040369.html]采用同步代码块的方式来实现对线程的同步,如下: 对于同步方法我想都知道,就是将同步关键字声明 ...

  7. Java基础8-多线程;同步代码块

    作业解析 利用白富美接口案例,土豪征婚使用匿名内部类对象实现. interface White{ public void white(); } interface Rich{ public void ...

  8. 深入理解使用synchronized同步方法和同步代码块的区别

    一.代码块和方法之间的区别 首先需要知道代码块和方法有什么区别: 构造器和方法块,构造器可以重载也就是说明在创建对象时可以按照不同的构造器来创建,那么构造器是属于对象,而代码块呢他是给所有的对象初始化 ...

  9. 同步方法、同步代码块、volidate变量的使用

    当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线程改过了. ...

随机推荐

  1. java第七周动手动脑

    public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); ...

  2. fast-fail事件的产生及其解决办法

    1.fail-fast事件出现的情景 import java.util.*; import java.util.concurrent.*; /* * * * fail-fast事件产生的条件:当多个线 ...

  3. ‘百度杯’十月场web ---login

    首先一看的题,既然是是web类的,就要查看源码,一看,最先有一行注释,估摸着是用户名和密码 果然登录上去了,显示一段乱码,源码也没有什么东西, 那就抓一次包吧 发现响应头里边有个show:0的响应,而 ...

  4. mysql 命令语句

    1.大部分数据库命令语句 数据库的命令 net start MYsql 启动的服务 net stop mysql 关闭服务 mysql -uroot -p 输入数据库名和密码登入 show datab ...

  5. dom4j解析xml字符串实例

    DOM4J 与利用DOM.SAX.JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异.功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml ...

  6. Linux进程管理学习资料

    下面是一些Linux进程管理相关的资料. 博客 Process Creation(一) Process Creation(二) 进程切换分析(1):基本框架 进程切换分析(2):TLB处理 When ...

  7. 输出cglib以及jdk动态代理产生的class文件

      --该设置用于输出jdk动态代理产生的类 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles&q ...

  8. Glide4 用法总结 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. Mongo 常用操作

    1.查询 [基本形式]db.col.find().pretty():pretty() 方法以格式化的方式来显示所有文档. [获取记录条数]:db.users.find().count(); [读取指定 ...

  10. 下载网络文件HttpURLConnection.getContentLength()大小为 0

    HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestProperty("Acce ...