关于线程锁的另外一个问题
2018-05-06 09:17
796 查看
多线程之间通过锁机制解决了共享资源的争夺,通常我们会使用某个具体的对象作为锁,那么,如果这个锁的值改变了?线程之间还会保持同步吗?
举例代码:
这是一个很普通的Java类。
接下来是对这个类操作的service:
主运行入口:
这里的输出结果会是怎样的呢?输出结果如下:
虽然线程改变了锁的值,但是两个线程之间还是同步的。
总结:只要线程锁对象不变,锁对象的值改不改变,都不影响线程之间的同步效果。
举例代码:
import java.util.Objects; public class Operator { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Operator operator = (Operator) o; return Objects.equals(id, operator.id) && Objects.equals(name, operator.name); } @Override public int hashCode() { return Objects.hash(id, name); } }
这是一个很普通的Java类。
接下来是对这个类操作的service:
public class OperatorService { public void updateName(Operator operator) { synchronized(operator) { System.out.println("线程 :" + Thread.currentThread().getName() + " 进入"); System.out.println("operator对象name属性值:" + operator.getName()); operator.setName("test" + Math.random()); System.out.println("operator对象name属性值已更改:" + operator.getName()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "离开"); } } }
主运行入口:
public class Main { public static void main(String[] args) throws Exception { Operator operator = new Operator(); operator.setId("123"); operator.setName("123"); OperatorService service = new OperatorService(); new Thread(new ThreadA(operator, service)).start(); new Thread(new ThreadB(operator, service)).start(); } static class ThreadA implements Runnable{ private Operator operator; private OperatorService service; public ThreadA(Operator operator, OperatorService service) { this.service = service; this.operator = operator; } @Override public void run() { service.updateName(operator); } } static class ThreadB implements Runnable{ private Operator operator; private OperatorService service; public ThreadB(Operator operator, OperatorService service) { this.service = service; this.operator = operator; } @Override public void run() { service.updateName(operator); } } }
这里的输出结果会是怎样的呢?输出结果如下:
线程 :Thread-0 进入 operator对象name属性值:123 operator对象name属性值已更改:test0.49531243439875083 Thread-0离开 线程 :Thread-1 进入 operator对象name属性值:test0.49531243439875083 operator对象name属性值已更改:test0.8638112164864292 Thread-1离开
虽然线程改变了锁的值,但是两个线程之间还是同步的。
总结:只要线程锁对象不变,锁对象的值改不改变,都不影响线程之间的同步效果。
相关文章推荐
- 关于提取另外一个swf里的某个mc问题
- 关于“设计4个线程,其中两个线程对j加1,另外两个线程对j减1”的问题
- 关于linux线程实时信号的一个问题
- 关于java多线程中同步的问题(两个线程访问同一个实例类的两个同步方法,会不会互相影响)
- 关于 将一个数组赋值给另外一个数组会重置原来数组的指针 的问题
- 关于一个程序调用另外一个程序或者传值的小问题
- 一个很有趣的关于线程锁的问题
- 关于从另外一个页面请求传值问题
- 关于异步、线程、委托的一个问题
- 请教大家一个关于.NET 的另外一个问题
- 关于多个异步任务线程如何取消上一个线程的问题
- 另外一个小问题 关于QT+ECLIPSE
- 关于httpcontext实际使用时出现的一个问题
- DataTable已经属于另外一个DataSet的问题
- python中关于class类中一个实例变量的引用问题
- 一个关于Media Player 跨iPhone版本的问题
- 一个困惑 关于调用的问题
- 关于调试的一个问题
- 另外开一个线程跑多线程
- 关于notification的一个小问题