synchronized——对象锁

本文详细介绍了Java中的synchronized关键字,解释了其如何实现线程同步及解决高并发问题。同时指出synchronized不能保证数据一致性的问题,并提供了示例代码。

     synchronized的中文意思是同步的,在Java语言的它是关键字,可以用来给对象和方法或者代码加锁,当它封锁某一块代码或方法的时候,其他线程是不能访问调用这一块代码或方法的。


  示例:


public static synchronized int generate(String tableName){使用Java中synchronized方法解决线程同步问题
		String sql = "select value from t_table_id where table_name";
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		int value = 0;
		try{
			conn = DbUtil.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1,tableName);
			rs = pstmt.executeQuery();
			if (!rs.next()){
				throw new RuntimeException();
			}
			value = rs.getInt("value");
			value++;//自加
			modifyValueField(conn, tableName,value);
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException();
		}finally{
			DbUtil.close(rs);
			DbUtil.close(pstmt);
			DbUtil.close(conn);
		}
		
		return value;
	}


    所以在Java中,synchronized代码锁可以解决线程同步、高并发的问题。但它只是对代码的封锁,并不能真正的做到对数据的加锁,因为在其他的方法里同样可以对同一条数据的增删改查,所以它是不能保证数据的一致性的。并且当另一个非synchronized方法调用这个代码块的时候,将会会发生阻塞。那我们又怎么才能做到数据的正真一致性呢?请看小编的下一篇博客。

### Java中`synchronized`关键字加的类型 在Java编程语言里,当使用`synchronized`关键字时,实际上是在操作对象上的内在(也称为监视器)。对于不同场景下使用的`synchronized`,所加的有所不同: - **同步方法**:如果`synchronized`用于实例方法,则它会对调用该方法的对象施加对象级别的。这意味着同一时间内只有一个线程可以执行某个特定对象上任何一个被标记为`synchronized`的方法[^3]。 ```java public class MyClass { public synchronized void instanceMethod() { // 这里的代码块会被对象保护 } } ``` - **同步静态方法**:而当`synchronized`应用于静态方法时,其定的是整个类本身而非单个对象实例。因此,在这种情况下,所有此类的实例都会受到相同的类级别的影响。这表示即使存在多个不同的对象实例,只要它们属于同一个类,那么任何时刻都仅有一个线程能够运行这类方法内的代码[^1]。 ```java public class MyClass { public static synchronized void staticMethod() { // 此处的代码由类级守护 } } ``` - **同步代码块**:还可以利用`synchronized`语句来定义更细粒度的定范围——即只针对某一部分代码而不是整个方法体实施控制。此时需明确指出作为的目标对象是什么。这种方式提供了更高的灵活性,因为开发者可以选择最合适的对象以减少不必要的阻塞[^5]。 ```java public class MyClass { private final Object lockObject = new Object(); public void someMethod() { synchronized(lockObject) { // 只有这部分代码受制于lockObject } } } ``` 综上所述,`synchronized`关键字可以根据上下文环境的不同分别加上对象锁或类,并且还支持自定义对象的应用模式。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值