synchronized 与 ReentrantLock 同步代码块简单实现

synchronized 同步代码块:

package net.flyingfat.lock;

public class SyncLock {

	public static void main(String args[]){

		final SyncLock lock=new SyncLock();
		Thread.currentThread().setName("main");
		new Thread(new Runnable() {
			public void run() {
				Thread.currentThread().setName("sub");
				try {
					Thread.sleep(1000);
					lock.run2();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();
		lock.run2();
	}

	public synchronized void run2()  {
		try{
			System.out.println("thread "+Thread.currentThread().getName()+" : get object lock ");
			if(Thread.currentThread().getName().equals("main")){
				System.out.println("main thread block, release object lock");
				this.wait(); //main线程执行到这会一直阻塞,并且释放对象锁,让sub线程能够进入该方法
				System.out.println("main thread is notifyed,get object lock again");
			}else if(Thread.currentThread().getName().equals("sub")){
				this.notify(); //sub线程得到main线程释放的对象锁,  唤醒阻塞的main线程使其往下执行
				System.out.println("sub thread notify");
			}
			System.out.println(Thread.currentThread().getName()+" : execute over,release object lock ");
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}

ReentrantLock 同步代码实现:

package net.flyingfat.lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class ReenLock {

	ReentrantLock lock=new ReentrantLock();
	Condition condition=lock.newCondition();

	public static void main(String[] args) {

		Thread.currentThread().setName("main");
		final ReenLock test4=new ReenLock();

		new Thread(new Runnable() {
			public void run() {
				try {
					Thread.sleep(1000);
					test4.run();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		},"sub").start();

		test4.run();

	}

	public void run(){
		try{
			lock.lock();
			System.out.println("Thread: "+Thread.currentThread().getName()+" get lock");
			if(Thread.currentThread().getName().equals("main")){
				System.out.println("main thread block, release object lock");
				condition.await(); //main线程执行到这会一直阻塞,并且释放对象锁,让sub线程能够进入该方法
				System.out.println("main thread is signaled,get object lock again");
			}
			if(Thread.currentThread().getName().equals("sub")){
				condition.signal(); //sub线程得到main线程释放的对象锁,  唤醒阻塞的main线程使其往下执行
				System.out.println("sub thread signal");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			lock.unlock();
			System.out.println("Thread: "+Thread.currentThread().getName()+" release lock");

		}
	}

}
时间: 2024-10-11 16:30:20

synchronized 与 ReentrantLock 同步代码块简单实现的相关文章

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

一.代码块和方法之间的区别 首先需要知道代码块和方法有什么区别: 构造器和方法块,构造器可以重载也就是说明在创建对象时可以按照不同的构造器来创建,那么构造器是属于对象,而代码块呢他是给所有的对象初始化的.底下看一个列子: public class Constructor_Methodblock { private int num; private String str; //构造器 public Constructor_Methodblock(int num,String str){ Syste

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

线程同步问题大都使用synchronized解决,有同步代码块和同步方法的两种方式,主要记一下这两种的区别 测试代码: 1 package com.xujingyang.testThread; 2 3 public class SynObj{ 4 public synchronized void showA(){ 5 System.out.println("showA.."); 6 try { 7 Thread.sleep(3000); 8 } catch (InterruptedEx

java中的静态代码块、构造代码块、普通代码块和同步代码块总结

java中的4中代码块总结如下: * 加了static的是静态代码块,在类中写了一对{}是构造代码块,在方法中写了一对{}是普通代码块, * java中还有一种代码块是同步代码块,常用在多线程中, synchronized关键字, * 同步代码块格式是:synchronized(同步对象){} * 静态代码块 先于构造代码块 先于构造方法执行 * 静态代码块 先于普通代码块 先于构造方法执行 * 构造代码块和普通代码块按照程序逻辑顺序执行 package 面试题; class HelloA{ p

java的同步方法和同步代码块,对象锁,类锁区别

/** * @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++)

java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)

import java.util.concurrent.locks.*; class DuckMsg{ int size;//烤鸭的大小 String id;//烤鸭的厂家和标号 DuckMsg(){ } DuckMsg(int size, String id){ this.size=size; this.id=id; } public String toString(){ return id + " 大小为:" + size; } } class Duck{ private int

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback

彻底理解线程同步与同步代码块synchronized

1 public class Demo { 2 public static synchronized void fun1(){ 3 } 4 public synchronized void fun2(){ 5 } 6 public static void main(String args[]) throws Exception{ 7 synchronized(xxx) { 8 9 } 10 } 11 } 三种同步类型 虽然写法不同,但实际上,只有一种,就是[同步代码块].这是核心核心核心.同步方

java:synchronized 同步代码块

synchronized:利用上锁实现数据同步,避免多线程操作的情况下,数据出现异常. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行. 另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 在代码块前加上 synchronized关键字,则此代码块就成为同步代码块, 格式: synchronized(同步对象){ 需要同步的代码: } class MyThread implements Runnab

2016/9/25编写java实验报告时对synchronized(同步代码块)的一些感悟

通过此次实验,明白了多线程的设置和启动.synchronized代码块的用法.线程的优先级使用方法.知道了那几类资源是线程共享的. 我现在理解的多线程是:实例化一个继承了Thread类或实现了Runnable接口的类(继承是为了使其拥有参与多线程的资格):然后再将该类run()中的代码交由Thread类来执行,以此实现多线程的同步运行 经过翻阅网络博客,和代码尝试,进一步的认识了同步代码块: ①synchronized(){}代码块在执行时先判断括号里的对象有没有被上锁: 若无,则上锁并开始执行