[英]Java - synchronized method/ block
如果我使用的是synchronized
对象,那么被同步的对象是否必须是static
?
编辑:我的意思是说对对象的引用必须是静态的。 我注意到,我正在阅读的一个示例指出,为了使线程在类A中使用同步方法,则对类A的引用必须是静态的。
因此,我想知道对对象的引用是否为静态规则,以便所有调用同步方法的线程都使用相同的实例副本。 在我的示例中,同步方法用于从1到10进行计数。因此,访问此同步方法的每个线程都应从1到10进行计数。我在没有静态的情况下尝试了此操作,结果不正确。
对象不能是静态的或非静态的:此属性仅适用于变量。 所有对象都同样生活在堆中,直到他们无法通过从“根”的引用可以达到了。
为了进行同步,我们需要对象本身(而不是持有引用的变量),因此,如果对这些对象的引用是由静态,非静态或局部变量持有的,则没有区别。
它不是 静态的或非静态 的 object
, 而是 其状态被保护以防止并发问题的数据。
1. synchronized
是一个关键字,当2个或更多线程访问同一对象时使用。
2.同步是关于保护关键数据的状态。
3.每个object
都有一个Lock and a Key
,因此为了保护作为 instance variable
的Data ,使用了object's key
。
4.同样,以保护State of the Data
是static
,即(类数据), class's key
使用。
冒着过于琐碎的风险:
检查代码并标识将在并发线程上运行的代码将访问的资源或数据集 。 要考虑的代码可能跨越多个方法,可能包括类。
通常,在代表资源集合的东西上进行同步:
如果资源集都是对象实例数据(非静态),那么可以在拥有数据的对象上进行同步。 (如果该对象不是'this',请问自己很多问题!)。
如果资源集中的任何部分是静态类数据,则必须在代表静态数据的内容上进行同步。 这可能是class
本身。 (也知道原始值不是对象)。
对于任何给定的资源,总是锁定同一件事。 这样可确保争用同一组资源的线程彼此之间正确协调。
如果要考虑两组这样的资源 ,则不能有任何一项属于这两组资源。 如果是这样,它们必须成为一组资源 。
如果在同一对象中有不竞争(读或写)方法(1)中标识的资源集中的 任何方法,则该方法可能不需要同步。 但是,如果将同时使用该方法,请考虑:
如果这种方法确实从另一组资源访问数据,则需要将其同步到该资源。
参见(3)。
不必要。
如果您正在构建一个Web应用程序(例如),并且每个客户端会话都在处理该会话特定的对象列表(例如,每个用户的书籍列表),那么您的线程可以在阅读该书籍列表的同时我的主题正在更新我的书籍清单。
我们不同步对象。 我们同步代码块(可以是synchronized
块中的方法或代码),以便一次只能有一个线程通过该块。 对象提供了锁,如果某个线程已经在该代码块中运行该线程,则该锁用于防止其他线程进入该代码块。 关于线程同步,对对象的引用是否为static
并不重要,但请注意,您不能在静态方法中使用非静态变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.