【问题标题】:Can process calls synchronised methods of class instead of thread in java?进程可以调用类的同步方法而不是java中的线程吗?
【发布时间】:2021-09-09 15:39:30
【问题描述】:

如果有一些类A有同步方法,那么如果一些线程,T1和T2,调用A类的同步方法,那就没问题了。但是如果我使用不扩展线程或实现可运行接口的普通类而不是T1和T2,例如P1和P2,那么如果P1和P2调用A类的方法,它会是一个正常的线程安全操作还是可以有任何有问题吗?

【问题讨论】:

  • 据我所知,总有一个Thread 执行Java 中的任何代码。在代码中的任何地方,您都可以通过调用 Thread t = Thread.currentThread();(这是一个静态方法)来获取当前的 Thread 实例。所以Thread实际上会调用你的P1(或P2)类方法,它会调用A的同步方法。甚至main方法也由Thread主线程)运行.你能提供一些代表你的问题的代码吗?

标签: java multithreading synchronization thread-safety java-threads


【解决方案1】:

从您的进程/类 P1 和 P2 调用类 A 的方法将属于在这些类 (P1/P2) 中创建的类 A 的各个对象。

P1:function1() ->
A a1 = new A();
a1.method1();
a1.method2();

P2: function2() ->
A a2 = new A();
a2.method1();
a2.method2();

DriverClass:main() ->
P1 p1 = 新 P1();
p1.function1();
P2 p2 = ne P2();
p2.function2();

上述类内部的单独调用将是同步调用,因为不涉及多线程,因此这些调用将是线程安全的。即使 method1() 和 method2() 也是 static 也适用。

但是,如果您在 A 类中有静态方法并计划将 P1 和 P2 部署为某种服务尝试以某种独立的方式访问 A 类(也是一个服务)的静态方法(非同步),这类似于您使用不同线程访问同一个静态方法的方式。在这种情况下,可能会发生脏读,您需要考虑此机制中的线程安全性。

希望它能消除您的疑问,否则您可以发布示例场景代码以便更好地理解。

【讨论】:

  • 我的意思是,如果我们创建 A a = new A() 然后将相同的 a 传递给 p1 和 p2。现在如果 A 有同步的方法,那么当 p1 和 p2 尝试访问 A 的 a1 和 a2 方法(它们是同步的)时,它会是安全操作吗?P1 和 P2 可以被视为两个线程 - 即使它们不扩展线程并实现可运行?
  • 我想我理解你的问题。简短而清晰的答案可以是 - 在任何系统中,多个进程(在这种情况下为 P1 和 P2)尝试访问相同的资源 (A),总是存在资源争用和竞争条件的机会。为了避免这种情况,使用了不同的技术(如信号量、锁等)。在您的情况下,“同步”将在内部处理它(只要您的资源保持不变,即“A”类的对象“a” ') 并且您可以安全地执行您的任务。
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 2014-08-29
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多