JAVA里synchronized同步代码块的一点疑问

问题描述

代码如下:public class SomeObj { public void print(int i){ System.out.println(Thread.currentThread().getName()+DateHelper.getNow()+ " " + i); try { wait(1000); } catch (InterruptedException e) { e.printStackTrace(); } }}public class ThreadA extends Thread{ private SyncTest st; public ThreadA(SyncTest syncTest){ this.st=syncTest; } public void run(){ st.methodA(); }}public class SyncTest { private volatile int i; public static void main(String[] args) throws Exception { new SyncTest().startUp(); } public void startUp(){ for (int a = 0; a < 10; a++) { new ThreadA(this).start(); } } private SomeObj obj = new SomeObj(); public void methodA() { synchronized (obj) { obj.print(i);System.out.println(Thread.currentThread().getName()+DateHelper.getNow() + " god is a girl"); i++; } }}=============================================== synchronized (obj) { 运行结果显示,同步代码块并没有被锁住,而把这行代码的obj替换成this或者随便其他的instance对象,都能锁住代码块。求解? 问题补充:public void print(int i){ //obj替換成this的時候,這行代碼前加syncronized

解决方案

因为wait(1000)会将当前对象obj的控制权(即锁)交出去1秒可以用Thread.sleep(1000)

时间: 2025-01-30 06:53:55

JAVA里synchronized同步代码块的一点疑问的相关文章

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

java线程学习4——线程同步之同步代码块

  模拟一个场景,两个人对同一个账户同时取钱   package cn.xy.Thread; public class Account {  /**   * 账户号   */  private String accountNo;  /**   * 账户余额   */  private double balance;  public Account()  {   super();  }  public Account(String accountNo, double balance)  {   s

基本线程同步(五)使用Lock同步代码块

声明:本文是< Java 7 Concurrency Cookbook >的第二章,作者: Javier Fernández González     译者:许巧辉 校对:方腾飞 使用Lock同步代码块 Java提供另外的机制用来同步代码块.它比synchronized关键字更加强大.灵活.它是基于Lock接口和实现它的类(如ReentrantLock).这种机制有如下优势: 它允许以一种更灵活的方式来构建synchronized块.使用synchronized关键字,你必须以结构化方式得到释

线程-同步代码块的问题。。。。。

问题描述 同步代码块的问题..... 数据库的几张表常用表的数据,我想写到几个静态变量中. 然后提供若干个get方法,同时还有一个set方法重置所有的静态变量. 请问如何能够在set重置方法没完成以前,让get方法的线程等待? 同时几个get方法又不能有相互影响. 就是set没完成,所有的get需要等待,但是不同的get之间没完成不需要等待. 来人啊... 解决方案 http://my.oschina.net/tinglanrmb32/blog/339661 解决方案二: http://blog

银行取款[多线程]{使用同步代码块确保线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题. 此处用多线程实现,同时取款的模拟实现,使用同步代码块确保线程同步,查看取款安全隐患问题,代码如下: --------------------------------------------------------------------------------------------------------------------------------------  * 线程同步 :使用同步块

java中的静态代码块、构造代码块、构造方法详解_java

运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB(); } } cla

java类加载器-关于java类加载的双亲委托机制的一点疑问

问题描述 关于java类加载的双亲委托机制的一点疑问 class Clazz2{ public static void main(String[] args) { ClassLoader classLoader = new ClassLoader() { @Override public Class<?> loadClass(String name) throws ClassNotFoundException { try { FileInputStream fileInputStream =

关于Java中进程中的优先级的一点疑问

问题描述 public class BasicThreadTest extends Thread{private String _name;public BasicThreadTest(String name){_name = name;}public void run(){try{for(int i = 0; i < 30; i++){System.out.println("run ... " + _name + " ... " + i);}}catch(E